HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH
VIỄN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN 1
BÀI GIẢNG
HỆ THỐNG PHÂN TÁN
(Dùng cho đề cương INT 1405)
Người biên soạn: ThS. Nguyễn Xuân Anh
Đơn vị công tác: Bộ môn Hệ thống
thông tin
Khoa CNTT 1
Hà nội 09/2021
MỤC LỤC
CHƯƠNG 1: TỔNG QUAN VỀ HỆ THỐNG PHÂN TÁN................................................. 9
1.1 Định
nghĩa hệ thống phân tán......................................................................................... 9
1.2 Quan
điểm về phần cứng............................................................................................ 10
1.2.1 Hệ
thống nhiều bộ vi xử lý......................................................................... 11
1.2.2 Hệ
thống nhiều máy tính............................................................................ 13
1.3 Quan
điểm về phần mềm............................................................................................. 13
1.3.1 Hệ
điều hành............................................................................................... 13
1.3.1.1 Hệ
điều hành chạy trên một bộ xử lý............................................................... 14
1.3.1.2 Hệ
điều hành cho nhiều bộ xử lý...................................................................... 14
1.3.1.3 Hệ
điều hành mạng và hệ điều hành phân tán................................................... 14
1.3.2 Phần
mềm ứng dụng.................................................................................... 15
1.4 Phân loại hệ thống phân tán........................................................................................ 15
1.4.1 Các
hệ thống điện toán phân tán................................................................ 15
1.4.1.1 Hệ
thống điện toán cụm.................................................................................. 15
1.4.1.2 Hệ
thống điện toán lưới................................................................................... 16
1.4.2 Hệ
thống thông tin phân tán....................................................................... 17
1.4.3 Hệ
thống lan tỏa.......................................................................................... 18
1.4.4 Điện
toán đám mây..................................................................................... 19
1.5 Mục
tiêu hệ thống phân tán......................................................................................... 20
1.5.1 Đảm
bảo khả năng sẵn sàng của tài nguyên............................................... 21
1.5.2 Trong
suốt đối với người sử dụng.............................................................. 22
1.5.2.1 Phân
loại tính trong suốt.................................................................................. 22
1.5.2.2 Mức
độ trong suốt.......................................................................................... 23
1.5.3 Tính
mở của hệ thống................................................................................. 24
1.5.4 Qui
mô hệ thống......................................................................................... 25
1.5.4.1 Các
vấn đề liên quan đến qui mô hệ thống....................................................... 25
1.5.4.2 Các
kỹ thuật xử lý qui mô hệ thống................................................................. 27
1.5.5 Hệ
thống phân tán và mạng máy tính......................................................... 28
1.6 Kiến
trúc hệ thống phân tán......................................................................................... 29
1.6.1 Các
mô hình kiến trúc................................................................................ 29
1.6.1.1 Mô hình
phân tầng.......................................................................................... 30
1.6.1.2 Mô hình đối
tượng phân tán............................................................................ 30
1.6.1.3 Mô
hình kênh sự kiện..................................................................................... 31
1.6.1.4 Mô hình dữ liệu
tập trung................................................................................ 32
1.6.2 Kiến
trúc hệ thống...................................................................................... 33
1.6.2.1 Kiến
trúc tập trung.......................................................................................... 33
1.6.2.2 Kiến
trúc không tập trung................................................................................ 38
1.6.2.3 Kiến
trúc lai ghép............................................................................................ 41
1.6.3 Kiến
trúc hệ thống và phần mềm trung gian.............................................. 41
1.6.4 Tự
quản lý trong các hệ thống phân tán..................................................... 41
CHƯƠNG 2: TRAO ĐỔI THÔNG TIN TRONG
HỆ THỐNG PHÂN TÁN..................... 43
2.1 Cơ
sở truyền thông..................................................................................................... 43
2.1.1 Giao
thức mạng........................................................................................... 43
2.1.1.1 Các
giao thức mức thấp.................................................................................. 45
2.1.1.2 Giao
thức tầng vận tải..................................................................................... 46
2.1.1.3 Các
giao thức mức cao................................................................................... 46
2.1.1.4 Giao
thức tầng trung gian................................................................................ 47
2.1.2 Phân
loại truyền thông................................................................................ 47
2.2 Gọi
thủ tục từ xa......................................................................................................... 49
2.2.1 Cơ
chế hoạt động........................................................................................ 49
2.2.2 Vấn
đề truyền tham số................................................................................ 52
2.2.3 Các
phương pháp gọi thủ tục từ xa............................................................. 53
2.2.4 Đối
tượng phân tán...................................................................................... 54
2.3 Truyền
thông điệp....................................................................................................... 55
2.3.1 Các
phương pháp truyền thông điệp.......................................................... 55
2.3.2 Truyền
thông điệp nhất thời....................................................................... 56
2.3.2.1 Các
hàm nguyên thủy...................................................................................... 56
2.3.2.2 Giao
diện chuyển thông điệp........................................................................... 57
2.3.3 Truyền
thông điệp bền bỉ............................................................................ 59
2.4 Truyền
thông luồng..................................................................................................... 60
2.4.1 Hỗ
trợ truyền thông liên tục...................................................................... 61
2.4.2 Luồng và chất lượng dịch
vụ....................................................................... 62
2.4.3 Đồng
bộ luồng............................................................................................. 63
2.5 Truyền
thông theo nhóm.............................................................................................. 65
2.5.1 Truyền
thông theo nhóm mức ứng dụng.................................................... 65
2.5.1.1 Tổ
chức hình cây............................................................................................ 65
2.5.1.2 Quảng
bá trong nhóm..................................................................................... 67
2.5.2 Lan
truyền ngẫu nhiên................................................................................. 68
CHƯƠNG 3: ĐẶT TÊN TRONG HỆ
THỐNG PHÂN TÁN.............................................. 72
3.1 Tên,
định danh và địa chỉ............................................................................................. 72
3.2 Đặt
tên và các giải pháp tìm kiếm................................................................................ 72
3.2.1 Đặt
tên phi cấu trúc..................................................................................... 72
3.2.1.1 Các
giải pháp tìm kiếm đơn giản...................................................................... 73
3.2.1.2 Tìm
kiếm dựa trên nguồn gốc.......................................................................... 74
3.2.1.3 Bảng
băm phân tán......................................................................................... 75
3.2.1.4 Cách
tiếp cận phân cấp................................................................................... 77
3.2.2 Đặt
tên có cấu trúc...................................................................................... 80
3.2.2.1 Không
gian tên............................................................................................... 80
3.2.2.2 Phân
giải tên................................................................................................... 81
3.2.2.3 Cài
đặt không gian tên.................................................................................... 83
3.2.2.4 Hệ
thống tên miền trên Internet........................................................................ 88
3.2.3 Đặt
tên dựa trên thuộc tính......................................................................... 92
3.2.3.1 Dịch
vụ thư mục............................................................................................. 93
3.2.3.2 Cài
đặt phân cấp............................................................................................ 93
3.2.3.3 Cài
đặt không tập trung................................................................................... 95
CHƯƠNG 4: ĐỒNG BỘ VÀ CÁC
GIẢI THUẬT PHÂN TÁN......................................... 98
4.1 Đồng bộ
đồng hồ vật lý............................................................................................... 98
4.1.1 Giải
thuật Cristian.................................................................................... 100
4.1.2 Giải
thuật Berkeley.................................................................................. 101
4.1.3 Giải
thuật trung bình................................................................................. 101
4.1.4 Giải
thuật tham chiếu quảng bá................................................................ 102
4.2 Thời
gian và đồng hồ logic......................................................................................... 103
4.2.1 Đồng
hồ Lamport..................................................................................... 104
4.2.2 Đồng
hồ vector......................................................................................... 106
4.2.3 Trạng
thái toàn cục................................................................................... 108
4.3 Các giải
thuật loại trừ tương hỗ phân tán.................................................................... 109
4.3.1 Giải
thuật tập trung................................................................................... 110
4.3.2 Giải
thuật không tập trung........................................................................ 110
4.3.3 Giải
thuật phân tán.................................................................................... 111
4.3.4 Giải
thuật thẻ bài....................................................................................... 111
4.3.5 So
sánh các giải thuật loại trừ.................................................................. 112
4.4 Các
giải thuật bầu chọn............................................................................................. 112
4.4.1 Các
giải thuật bầu chọn truyền thống...................................................... 113
4.4.1.1 Giải
thuật nổi bọt.......................................................................................... 113
4.4.1.2 Giải
thuật vòng.............................................................................................. 113
4.4.2 Bầu
chọn trong môi trường không dây.................................................... 114
4.4.3 Bầu
chọn trong các hệ thống qui mô lớn................................................ 115
4.5 Hệ
thống định vị........................................................................................................ 116
4.5.1 Định
vị toàn cầu các nút........................................................................... 116
4.5.2 Kỹ
thuật định vị khác................................................................................ 116
4.5.3 Định
vị logic các nút................................................................................ 116
CHƯƠNG 5: TIẾN TRÌNH TRONG CÁC HỆ
THỐNG PHÂN TÁN............................. 117
5.1 Các
luồng................................................................................................................. 117
5.1.1 Khái
niệm luồng....................................................................................... 117
5.1.2 Luồng
trong các hệ thống độc lập........................................................... 118
5.1.3 Cài
đặt luồng............................................................................................. 119
5.1.4 Luồng
trong các hệ thống phân tán.......................................................... 120
5.1.4.1 Đa luồng trên
máy khách............................................................................... 120
5.1.4.2 Đa luồng trên
máy chủ.................................................................................. 120
5.2 Ảo
hóa..................................................................................................................... 122
5.2.1 Vai
trò ảo hóa trong các hệ thống phân tán............................................. 122
5.2.2 Kiến
trúc của các máy ảo......................................................................... 123
5.3 Máy
khách............................................................................................................... 124
5.3.1 Giao
diện người sử dụng mạng................................................................ 124
5.3.2 Phần
mềm máy khách đảm bảo tính trong suốt phân
bố........................ 125
5.4 Máy
chủ................................................................................................................... 126
5.4.1 Các
vấn đề thiết kế chung........................................................................ 126
5.4.2 Cụm
máy chủ............................................................................................ 127
5.4.2.1 Các
mô hình cài đặt...................................................................................... 127
5.4.2.2 Quản
lý cụm máy chủ.................................................................................... 128
5.5 Di trú mã................................................................................................................. 128
5.5.1 Các
giải pháp di trú mã............................................................................. 128
5.5.2 Di
trú và tài nguyên cục bộ...................................................................... 130
5.5.3 Di
trú trong hệ thống không đồng nhất................................................... 130
CHƯƠNG 6: QUẢN TRỊ GIAO TÁC VÀ
ĐIỀU KHIỂN TƯƠNG TRANH................... 131
6.1 Khái
niệm giao tác.................................................................................................... 132
6.1.1 Giao
tác phẳng.......................................................................................... 132
6.1.2 Các
giao tác lồng nhau............................................................................. 133
6.1.3 Giao
tác phân tán...................................................................................... 134
6.2 Các
phương pháp điều khiển tương tranh.................................................................. 134
6.2.1 Điều
khiển tương tranh bi quan................................................................ 134
6.2.2 Điều
khiển tương tranh lạc quan.............................................................. 134
6.2.3 Điều
khiển tương tranh dựa trên nhãn thời gian..................................... 135
CHƯƠNG 7: PHỤC HỒI VÀ TÍNH CHỊU
LỖI............................................................... 136
7.1 Giới
thiệu tính chịu lỗi................................................................................................ 136
7.1.1 Khái
niệm tính chịu lỗi............................................................................ 136
7.1.2 Phân
loại lỗi.............................................................................................. 136
7.2 Các
biện pháp đảm bảo tính chịu lỗi.......................................................................... 137
7.2.1 Che
giấu lỗi bằng biện pháp dư thừa........................................................ 137
7.2.2 Tiến
trình bền bỉ........................................................................................ 138
7.2.2.1 Lựa
chọn mô hình cài đặt.............................................................................. 138
7.2.2.2 Che
giấu lỗi và nhân bản............................................................................... 139
7.2.2.3 Đồng
thuận trong các hệ thống lỗi.................................................................. 139
7.2.2.4 Phát
hiện lỗi.................................................................................................. 142
7.2.3 Truyền
thông khách/chủ tin cậy............................................................... 142
7.2.3.1 Truyền
thông điểm – điểm............................................................................. 143
7.2.3.2 Các
tình huống lỗi khi thủ tục từ xa................................................................ 143
7.2.4 Truyền
thông nhóm tin cậy...................................................................... 146
7.2.4.1 Truyền
thông nhóm tin cậy cơ bản................................................................. 146
7.2.4.2 Truyền
thông nhóm tin cậy trong các
hệ thống lớn......................................... 146
7.3 Khẳng
định phân tán................................................................................................. 148
7.3.1 Giao
thức khẳng định một pha................................................................. 148
7.3.2 Giao
thức khẳng định hai pha................................................................... 149
7.3.3 Giao
thức khẳng định ba pha.................................................................... 149
7.4 Phục
hồi................................................................................................................... 151
7.4.1 Các
biện pháp phục hồi............................................................................ 151
7.4.2 Điểm
kiểm tra........................................................................................... 152
7.4.2.1 Điểm
kiểm tra độc lập................................................................................... 153
7.4.2.2 Điểm
kiểm tra phối hợp................................................................................. 154
7.4.3 Ghi
nhật ký thông điệp............................................................................. 154
CHƯƠNG 8: NHẤT QUÁN VÀ NHÂN BẢN................................................................. 157
8.1 Giới
thiệu chung........................................................................................................ 157
8.1.1 Lý do
nhân bản.......................................................................................... 157
8.1.2 Nhân
bản là kỹ thuật mở rộng qui mô...................................................... 158
8.2 Các mô
hình nhất quán lấy dữ liệu làm trung tâm........................................................ 159
8.2.1 Nhất
quán liên tục..................................................................................... 160
8.2.2 Nhất
quán theo thứ tự thao tác................................................................. 162
8.2.2.1 Mô
hình nhất quán nghiêm ngặt..................................................................... 162
8.2.2.2 Mô
hình nhất quán tuần tự............................................................................. 163
8.2.2.3 Mô
hình nhất quán nhân quả.......................................................................... 164
8.2.2.4 Mô
hình nhất quán hàng đợi.......................................................................... 165
8.2.3 Nhất
quán theo nhóm các thao tác........................................................... 166
8.2.3.1 Mô
hình nhất quán yếu.................................................................................. 167
8.2.3.2 Mô
hình nhất quán đi ra................................................................................ 167
8.2.3.3 Mô
hình nhất quán đi vào.............................................................................. 168
8.2.4 Tính nhất quán và
gắn kết.......................................................................... 169
8.3 Nhất quán lấy máy
khách làm trung tâm..................................................................... 169
8.3.1 Mô hình nhất quán sau cùng..................................................................... 170
8.3.2 Mô
hình nhất quán đọc đều...................................................................... 170
8.3.3 Mô
hình nhất quán ghi đều....................................................................... 171
8.3.4 Nhất
quán đọc kết quả ghi........................................................................ 172
8.3.5 Nhất
quán ghi sau khi đọc........................................................................ 172
8.4 Quản
lý các bản sao................................................................................................. 173
8.4.1 Vị
trí máy chủ bản sao.............................................................................. 173
8.4.2 Bản
sao nội dung và vị trí......................................................................... 173
8.4.2.1 Bản
sao thường trực..................................................................................... 173
8.4.2.2 Bản
sao khởi nguồn từ máy chủ..................................................................... 174
8.4.2.3 Bản
sao khởi nguồn từ máy khách................................................................. 174
8.4.3 Phân
phát nội dung.................................................................................... 175
8.4.3.1 Trạng
thái và thao tác.................................................................................... 175
8.4.3.2 Các
giao thức kéo và đẩy............................................................................. 176
8.4.3.3 Phương
pháp lan truyền cập nhật................................................................... 177
8.5 Các
giao thức nhất quán........................................................................................... 177
8.5.1 Nhất
quán liên tục..................................................................................... 177
8.5.1.1 Giới hạn
sai số.............................................................................................. 178
8.5.1.2 Giới
hạn chênh lệch trạng thái........................................................................ 179
8.5.1.3 Giới
hạn độ lệch
thứ tự................................................................................ 179
8.5.2 Các
giao thức dựa trên bản chính............................................................ 179
8.5.2.1 Giao
thức ghi từ xa....................................................................................... 180
8.5.2.2 Giao
thức ghi cục bộ..................................................................................... 181
8.5.3 Các
giao thức nhân bản cập nhật.............................................................. 181
8.5.3.1 Nhân
bản tích cực........................................................................................ 182
8.5.3.2 Giao
thức dựa trên đại diện........................................................................... 182
8.5.4 Giao
thức gắn kết bộ nhớ cache.............................................................. 183
8.5.5 Cài
đặt nhất quán lấy máy khách làm trung tâm...................................... 184
8.5.5.1 Cài
đặt đơn thuần......................................................................................... 184
8.5.5.2 Nâng
cao hiệu năng...................................................................................... 185
CHƯƠNG 9: BẢO MẬT.................................................................................................. 187
9.1 Giới
thiệu chung........................................................................................................ 187
9.1.1 Các
hình thức xâm phạm hệ thống thông tin........................................... 187
9.1.1.1 Tấn
công thăm dò......................................................................................... 189
9.1.1.2 Truy
nhập trái phép....................................................................................... 189
9.1.1.3 Tấn
công từ chối dịch vụ............................................................................... 189
9.1.1.4 Phần
mềm độc hại........................................................................................ 189
9.1.2 Các
vấn đề thiết kế................................................................................... 190
9.1.2.1 Xác
định trọng tâm bảo mật.......................................................................... 190
9.1.2.2 Phân
tầng cơ chế bảo mật............................................................................. 191
9.1.2.3 Phân
bố cơ chế bảo mật............................................................................... 192
9.1.2.4 Tính
đơn giản trong thiết kế bảo mật.............................................................. 193
9.1.3 Mã
hóa....................................................................................................... 194
9.1.3.1 Giải
thuật mã hóa DES.................................................................................. 195
9.1.3.2 Giải thuật mã hóa RAS................................................................................. 196
9.1.3.3 Hàm
băm MD5............................................................................................ 197
9.2 Các
kênh bảo mật.................................................................................................... 198
9.2.1 Xác
thực.................................................................................................... 198
9.2.1.1 Xác
thực dựa trên khóa bí mật...................................................................... 198
9.2.1.2 Xác
thực sử dụng trung tâm phân phối khóa.................................................. 200
9.2.1.3 Xác
thực dựa trên mã hóa khóa công khai.................................................... 202
9.2.2 Toàn
vẹn và bí mật thông điệp................................................................. 202
9.2.2.1 Chữ
ký số.................................................................................................... 202
9.2.2.2 Khóa
phiên................................................................................................... 203
9.2.3 Truyền
thông nhóm bảo mật.................................................................... 204
9.2.3.1 Bí
mật truyền thông trong nhóm.................................................................... 204
9.2.3.2 Bảo
mật các máy chủ nhân bản..................................................................... 204
9.2.4 Xác
thực bằng Kerberos.......................................................................... 205
9.3 Kiểm
soát truy nhập.................................................................................................. 207
9.3.1 Nguyên
lý kiểm soát truy nhập................................................................ 207
9.3.1.1 Ma
trận kiểm soát truy nhập.......................................................................... 207
9.3.1.2 Miền
bảo vệ................................................................................................. 208
9.3.2 Tường
lửa.................................................................................................. 208
9.3.3 Bảo
mật mã di động.................................................................................. 209
9.3.3.1 Bảo
vệ Agent............................................................................................... 209
9.3.3.2 Bảo
vệ đích.................................................................................................. 210
9.3.4 Từ
chối dịch vụ......................................................................................... 213
9.4 Quản
lý bảo mật....................................................................................................... 214
9.4.1 Quản
lý khóa............................................................................................ 214
9.4.1.1 Thiết
lập khóa............................................................................................... 215
9.4.1.2 Phân
phát khóa............................................................................................. 215
9.4.1.3 Thời
gian sống của chứng chỉ......................................................................... 217
9.4.2 Quản
lý bảo mật nhóm.............................................................................. 217
9.4.3 Quản
lý ủy quyền...................................................................................... 218
9.4.3.1 Khả
năng và chứng chỉ thuộc tính.................................................................. 218
9.4.3.2 Ủy
nhiệm...................................................................................................... 220
9.5 Một
số vấn đề bảo mật khác..................................................................................... 221
CHƯƠNG 10: CÔNG NGHỆ PHÁT TRIỂN HỆ
THỐNG PHÂN TÁN............................ 223
10.1 Gọi
thủ tục từ xa....................................................................................................... 223
10.2 Mô hình
đối tượng thành phần phân tán..................................................................... 226
10.2.1 Các đặc
trưng cơ bản của DCOM............................................................ 226
10.2.2 Kiến
trúc của DCOM............................................................................... 226
10.3 Kiến
trúc môi trường yêu cầu đối tượng chung........................................................... 226
10.3.1 Các
thành phần cơ bản của CORBA........................................................ 227
10.3.1.1 Môi
trường ORB...................................................................................... 228
10.3.1.2 Ứng
dụng máy khách............................................................................... 230
10.3.1.3 Đối
tượng thực hiện.................................................................................. 230
10.3.2 Corba và
các yêu cầu phần mềm trung gian............................................ 244
10.3.2.1 Ngôn
ngữ định nghĩa giao diện.................................................................. 244
10.3.2.2 Xác
định địa chỉ đối tượng
phục vụ............................................................ 244
10.3.2.3 Gọi
đối tượng phục vụ.............................................................................. 244
10.3.3 Áp
dụng CORBA trong xây dựng ứng dụng phân tán.............................. 244
10.3.3.1 Xây
dựng ứng dụng trên máy chủ.............................................................. 244
10.3.3.2 Xây dựng
ứng dụng máy khách................................................................. 245
10.4 Gọi
phương thức từ xa trong Java............................................................................. 245
10.4.1 Mô hình
khách/chủ................................................................................... 245
10.4.2 Các
cơ chế liên quan................................................................................ 245
10.4.3 Các
lớp hỗ trợ........................................................................................... 246
10.4.4 Xây
dựng một ứng dụng phân tán với RMI.............................................. 246
10.4.4.1 Thiết
kế và cài đặt các thành phần của ứng
dụng........................................ 246
10.4.4.2 Biên
dịch các tập tin nguồn và tạo Stubs và Skeleton................................. 246
10.4.4.3 Tạo
các lớp có thể truy xuất từ mạng......................................................... 247
10.4.4.4 Thực
thi ứng dụng..................................................................................... 247
10.5 Dịch
vụ web............................................................................................................. 247
10.5.1 Các
thành phần trong kiến trúc dịch vụ Web.......................................... 247
10.5.2 Trao
đổi thông tin của dịch vụ Web......................................................... 248
10.5.2.1 Giao
thức SOAP...................................................................................... 248
10.5.2.2 Ngôn
ngữ WSDL..................................................................................... 249
10.5.2.3 Thư
mục UDDI........................................................................................ 249
10.5.3 Quy
trình xây dựng ứng dụng dịch vụ
Web............................................. 249
10.6 Kiến
trúc hướng dịch vụ............................................................................................ 250
10.6.1 Giới
thiệu về kiến trúc hướng dịch vụ..................................................... 250
10.6.2 Các
dịch vụ................................................................................................ 251
10.6.3 Mô hình
cặp lỏng...................................................................................... 252
10.6.4 Chu
kỳ sống dịch vụ.................................................................................. 253
10.6.5 Phân
loại dịch vụ....................................................................................... 253
10.6.6 Trục
dịch vụ doanh nghiệp....................................................................... 253
10.6.7 Các mô
hình dựa trên SOA...................................................................... 254
10.6.8 Các
mẫu trao đổi thông điệp................................................................... 254
CHƯƠNG 11: THỰC HÀNH............................................................................................. 255
11.1 Truyền
thông nhất thời............................................................................................... 255
11.2 Viết
ứng dụng dịch vụ web........................................................................................ 255
11.3 Giao
thức NTP......................................................................................................... 256
TÀI LIỆU THAM
KHẢO........................................................................................................ 257
CHƯƠNG 1:
TỔNG QUAN
VỀ HỆ THỐNG PHÂN TÁN
Các hệ thống máy tính đang phát
triển mạnh mẽ, kể từ sau khi máy tính
điện tử đầu tiên ANIAC ra đời vào
năm 1946 cho đến năm 1980 các máy tính có kích
thước lớn và khá đắt tiền, do đó
nhiều cơ quan chỉ có vài máy tính và thiếu
phương tiện kết nối chúng, những máy tính này
vận hành độc lập với nhau. Tuy nhiên bắt
đầu từ năm 1980, những tiến bộ về
công nghệ đã làm thay đổi tình hình, tiến bộ
thứ nhất là sự phát triển mạnh mẽ bộ
vi xử lý cho máy tính cá nhân, ban đầu thanh ghi chỉ có
8 bit rồi sau đó chuyển dần sang 16, 32 và hiện
nay là 64 bit, chúng có khả năng tính toán như một máy
tính lớn nhưng giá thành lại thấp hơn rất
nhiều. Bước tiến bộ thứ hai đó là
sự phát minh ra mạng máy tính tốc độ cao, các
mạng cục bộ cho phép kết nối hàng trăm máy
tính với băng thông lên tới 10 Gbit/s, các mạng
diện rộng cho phép kết nối hàng triệu máy tính
với băng thông từ 64 Kbit/s đến Gbit/s. Với
những thành tựu này có thể kết nối số lượng
lớn máy tính với nhau qua mạng tốc độ cao, chúng
khác hẳn với các hệ thống tập trung chỉ bao
gồm máy tính và một số thiết bị ngoại vi
phục vụ cho các thao tác của người dùng.
Hệ thống phân tán bao gồm các máy
tính và các thiết bị khác như thiết bị cầm
tay, điện thoại di động thông minh…
được kết nối với nhau để
thực hiện nhiệm vụ tính toán. Hệ thống phân
tán xuất phát từ nhu cầu sử dụng khả
năng tính toán tốt hơn và hiệu quả hơn
bằng cách kết hợp khả năng tính toán của
từng máy tính độc lập, điều đó đã
trở thành hiện thực dựa trên những tiến
bộ về công nghệ mạng. Ba yếu tố quyết
định tốc độ tính toán trong các máy tính bao
gồm tốc độ của bộ vi xử lý trung tâm CPU,
bộ nhớ RAM và kênh truyền trên bo mạch chủ.
Đối với hệ thống phân tán, một yêu cầu
mới quan trọng đã nảy sinh đó là vấn
đề trao đổi thông tin giữa các máy tính,
thiếu yếu tố này thì nhiệm vụ tính toán trên môi
trường phân tán sẽ không thể thực hiện
được. Tốc độ truyền dẫn trong các
công nghệ mạng ngày càng tăng đã tạo
điều kiện cho sự phát triển các ứng
dụng phân tán, các máy tính có thể trao đổi thông tin và
chia sẻ dữ liệu với nhau mà không phụ thuộc
vào khoảng cách địa lý.
Trong hệ thống phân tán, các phần
mềm ứng dụng chạy trên các máy tính trao đổi
thông tin với nhau qua mạng, chúng trao đổi thông tin và
phối hợp các hoạt động chỉ bằng cách
truyền thông điệp làm cho người dùng cảm giác
như đang sử dụng một hệ thống
đơn lẻ. Khái niệm phân tán được thể
hiện bởi tính độc lập của từng máy tính nhưng phải
phối hợp làm việc với nhau để
người sử dụng không có cảm giác các thành
phần rời rạc. Ví dụ, một hệ thống bán
hàng gồm nhiều cửa hàng đặt tại những
vị trí khác nhau, việc nhập thông tin hàng hóa được
thực hiện tại nhiều địa điểm
như cửa hàng, nhà kho…, tuy nhiên các nhân viên khai thác
đều có thể tìm thấy thông tin theo yêu cầu
của mình như thể các thông tin đó đang
được lưu trữ trên máy tính của
người sử dụng. Nhìn chung việc xây dựng các
ứng dụng phân tán phức tạp hơn nhiều so
với các ứng dụng tập trung, trong nhiều
trường hợp bắt buộc phải xây dựng các
ứng dụng phân tán vì những lý do sau:
-
Yêu cầu tính toán phân tán:
Ứng dụng chạy trên nhiều máy tính khác nhau nhằm
tận dụng khả năng tính toán song song hoặc
nhằm mục đích sử dụng khả năng tính
toán của các máy tính chuyên dụng để nâng cao hiệu
năng của hệ thống.
-
Yêu cầu về khả năng chịu lỗi: Yêu cầu này liên quan tới các hệ
thống cần phải đảm bảo an toàn tuyệt
đối ngay cả khi có sự cố xảy ra trên
một máy tính nào đó thì cũng không làm ảnh
hưởng đến hoạt động của toàn
bộ hệ thống, điều này được
thực hiện bằng cách sử dụng mọi biện
pháp nhằm mục đích kịp thời phát hiện và
xử lý lỗi.
-
Chia sẻ tài nguyên: Những
người sử dụng trao đổi thông tin với
nhau thông qua một ứng
dụng trên mạng. Mỗi người sử dụng
chạy một ứng dụng phân tán trên máy tính của mình
và chia sẻ các đối tượng sử dụng.
Một số ứng dụng phải chạy trên nhiều
máy tính vì dữ liệu được đặt phân tán
trên mạng liên quan đến quyền quản lý và
quyền sở hữu dữ liệu: cho phép truy nhập
dữ liệu từ xa nhưng không cho phép sao chép
để lưu giữ cục bộ.
Trong các hệ thống phân tán, môi
trường mạng đóng vai trò quan trọng trong
việc phân phát dữ liệu đến các thành phần và
tập hợp kết quả tính toán của các thành
phần đó. Các máy tính kết nối với nhau trên
mạng đảm nhiệm chức năng truyền thông
cho các ứng dụng, chúng không chia sẻ bộ nhớ cho
nhau do đó không thể sử dụng các biến toàn
cục để trao đổi thông tin, thông tin trao
đổi giữa các máy tính chỉ được
thực hiện thông qua cơ chế trao đổi thông
điệp. Mạng là tài nguyên chung của hệ thống
do đó khi xây dựng hệ thống phân tán cần
phải xem xét đến các vấn đề như:
Băng thông, các điểm có thể xảy ra sự
cố, bảo mật và an toàn dữ liệu, đồng
bộ tiến trình. Quá trình triển khai các ứng dụng
trong hệ thống phân tán thường gặp một
số khó khăn sau:
-
Trên mạng có nhiều loại máy tính và thiết
bị mạng của nhiều nhà sản xuất khác nhau và
các máy tính được cài đặt các hệ
điều hành khác nhau. Các thiết bị dòng Little endian và
big endian thể hiện các bit trong mỗi byte như nhau
nhưng sắp xếp thứ tự byte dữ liệu
ngược nhau.
-
Khó tích hợp các phần mềm vì chúng được
phát triển trên các ngôn ngữ lập trình khác nhau.
-
Thời gian phát triển phần mềm lâu hơn,
số lượng dòng lệnh và các thủ tục
nhiều hơn, do đó thường kéo theo chi phí xây
dựng hệ thống cao.
Thực tế việc xây dựng
nền tảng cho các hệ thống phân tán vẫn dựa
trên mô hình phân tầng OSI, trong đó 4 tầng thấp
(vật lý, liên kết dữ liệu, mạng và giao
vận) giải quyết các vấn đề như phát hiện
và sửa lỗi, định tuyến...., những vấn
đề này thường do hệ điều hành
đảm nhiệm. Tuy nhiên việc áp dụng 3 tầng cao
(phiên làm việc, trình diễn và ứng dụng) đã
được sử dụng trong các sản phẩm
nền của hệ thống phân tán nhằm mục
đích xử lý các thủ tục kết nối giữa
các thành phần phân tán và thể hiện cấu trúc dữ
liệu phức tạp của các ứng dụng, các
sản phẩm như vậy gọi là phần mềm trung
gian. Các ứng dụng phân tán thường được
xây dựng dựa trên nền hệ điều hành và các
thư viện hỗ trợ việc xử lý phân tán, chúng
thực hiện các nhiệm vụ xác định vị trí
của các máy tính, đồng bộ và mã hóa thông tin.
Các hệ thống phân tán bao gồm
nhiều bộ vi xử lý, nhưng có nhiều cách
để tổ chức chúng, nó thể hiện ở cách
kết nối và trao đổi thông tin như thế nào. Michael J. Flynn đã chỉ ra hai đặc
trưng cơ bản cho một hệ thống tính toán là số
lượng luồng xử lý lệnh và số lượng
kênh chuyển dữ liệu, như vậy về lý
thuyết có thể xây dựng 04 loại sau:
-
Đơn
luồng xử lý, đơn luồng dữ liệu:
Bộ vi xử lý chỉ có một luồng thực thi các
lệnh và một kênh truyền dữ liệu, các máy tính cá
nhân là ví dụ điển hình của loại này.
-
Đơn
luồng xử lý đa luồng dữ liệu: Bao gồm
nhiều bộ xử lý nhưng chỉ có 01 bộ xử
lý đóng vai trò tiếp nhận các chỉ thị
để ra lệnh cho các bộ xử lý khác thực
hiện song song.
-
Đa
luồng xử lý và đơn luồng dữ liệu:
Nhiều bộ xử lý cùng chia sẻ một luồng
dữ liệu, thực tế khó có thể tìm thấy máy
tính thuộc loại này.
-
Đa
luồng xử lý và đa luồng dữ liệu: Nhiều
bộ xử lý và nhiều luồng dữ liệu, mỗi
bộ xử lý sở hữu bộ đếm
chương trình, chương trình và dữ liệu. Như
vậy có thể chia làm hai nhóm: hệ thống nhiều
bộ xử lý và hệ thống nhiều máy tính. Trong
hệ thống nhiều bộ xử lý, các bộ xử lý
có quan hệ chặt chẽ với nhau, chúng dùng chung bộ
nhớ chia sẻ, như vậy việc trao đổi thông
tin giữa các bộ xử lỷ có thể thực
hiện đơn giản bằng cách đọc các ô
nhớ. Trong hệ thống phân tán, mỗi bộ xử lý sở
hữu bộ nhớ riêng, các bộ xử lý ràng buộc
không chặt chẽ, hệ thống phân tán thuộc
loại này, mỗi máy tính đóng vai trò như một
bộ xử lý và chúng trao đổi thông tin với nhau trên
nhiều kênh truyền trên mạng.
Dựa trên cách kết nối và cách trao
đổi thông tin giữa các thành viên, hệ thống phân
tán có thể phân thành hệ thống nhiều bộ vi
xử lý trong đó các bộ vi xử lý dùng chung bộ
nhớ và hệ thống nhiều tính máy tính trong đó
mỗi bộ vi xử lý có bộ nhớ riêng. Hệ
thống nhiều máy tính được coi là đồng
nhất nếu các máy tính cùng chung nền tảng phần
cứng, hệ điều hành và mạng ngược
lại gọi là hệ thống không đồng nhất. Trong
hệ thống nhiều bộ vi xử lý, các bộ vi
xử lý dùng chung bộ nhớ, việc trao đổi thông
tin giữa các bộ vi xử lý được thực hiện bằng cách đọc/ghi các ô
nhớ. Ngoài các chức năng truyền thống của
hệ điêu hành như xử
lý gọi hệ thống, quản lý bộ nhớ, quản
lý tập tin, quản lý thiết bị vào ra, hệ
điều hành của hệ thống nhiều bộ vi
xử lý phải thực hiện các chức năng
đặc biệt như đồng bộ tiến trình,
quản lý tài nguyên, lập lịch làm việc. Trước
hết, chúng ta sẽ tìm hiểu sơ bộ về
phần cứng của hệ thống nhiều bộ vi
xử lý sau đó sẽ đề cập tới các
vấn đề về hệ điều hành trong các
hệ thống này. Hệ thống nhiều bộ vi xử
lý đều có đặc điểm chung là các đơn
vị xử lý trung tâm đều được kết
nối vào kênh kết nối chung trong bo mạch chủ và
truy nhập trực tiếp vào bộ nhớ dùng chung.
Hình 1.16-a minh họa hệ thống
nhiều bộ vi xử lý dựa trên một kênh truyền,
các đơn vị xử lý trung tâm và các mô-dun bộ nhớ
dùng chung một kênh truyền để trao đổi thông
tin. Trước khi truy nhập ô
nhớ, đơn vị xử lý trung tâm phải
kiểm tra xem kênh truyền có bận hay không, nếu
rỗi thì đơn vị xử lý trung tâm đặt
địa chỉ ô nhớ lên kênh, phát tín hiệu
điều khiển và chờ cho đến khi bộ
nhớ đặt giá trị của ô nhớ đã yêu
cầu lên kênh truyền. Nếu kênh truyền bận,
đơn vị xử lý trung tâm phải chờ cho
đến khi kênh truyền rỗi, như vậy nảy
sinh vấn đề về quản lý tương tranh.
Đối với hệ thống chỉ có hai hoặc ba
đơn vị xử lý trung tâm thì việc quản lý
tương tranh tương đối đơn giản,
vấn đề sẽ trở nên khá phức tạp
đối với hệ thống có 32 hoặc 64 đơn
vị xử lý trung tâm. Nói chung, hệ thống sẽ
bị giới hạn bởi băng thông của kênh
truyền và hầu hết các CPU sẽ lãng phí thời gian
chờ đọc ô nhớ. Để giải quyết
vấn đề này, người ta thêm bộ nhớ
đệm vào mỗi CPU như minh họa trên hình 1.16-b,
bộ nhớ đệm có thể được tính
hợp trong CPU nằm trên bo mạch bộ vi xử lý
hoặc tổ hợp các phương án trên. Bộ nhớ
đệm trao đổi thông tin với bộ nhớ dùng
chung theo phương pháp đọc/ghi từng khối 32
hoặc 64 byte, đơn vị xử lý trung tâm sẽ
đọc/ghi các ô nhớ trong bộ nhớ đệm,
như vậy sẽ giảm đáng kể lưu
lượng trên kênh truyền chung.

(a) Không có bộ nhớ đệm.
(b) Có bộ nhớ đệm.
(c) Có bộ nhớ đệm và bộ
nhớ riêng.
Hình 1.16 Ba loại hệ thống
nhiều bộ xử lý dựa trên một kênh
Mỗi khối bộ nhớ đệm
được đánh dấu bởi một trong hai
trạng thái, chỉ đọc hoặc đọc/ghi.
Nếu CPU muốn ghi một ô nhớ mà ô nhớ đó
xuất hiện trong các bộ nhớ đệm khác,
phần cứng của kênh truyền sẽ phát hiện tính
hiệu ghi và chuyển tín hiệu đó đến tất
cả các bộ nhớ đệm khác. Nếu các bộ
nhớ đệm này đã có nội dung giống như
trong bộ nhớ, chúng có thể từ chối bản sao
đó và cho phép bộ điều khiển ghi chốt
khối bộ nhớ đệm trong bộ nhớ dùng
chung trước khi thay đổi ô nhớ. Một số
bộ nhớ đệm đang thay đổi, nó phải
ghi lại nội dung ô nhớ đó vào bộ nhớ dùng
chung trước khi yêu cầu ghi có thể tiếp tục
thực hiện hoặc chuyển trực tiếp giá
trị đó đến bộ điều khiển ghi qua
kênh truyền. Hình 1.16-c minh
họa một kiến trúc khác, CPU không chỉ có bộ
nhớ đệm mà còn có bộ nhớ cục bộ riêng
được truy nhập bằng kênh riêng. Để
sử dụng cấu hình này một cách tối ưu, trình
biên dịch sẽ đặt tất cả chương
trình các hằng số, dữ liệu chỉ đọc và
các biến số trong bộ nhớ riêng, bộ nhớ dùng
chung khi đó sẽ được dùng cho các biến dùng
chung. Nói chung, kiến trúc này giảm đáng kể lưu
lượng trên kênh chung nhưng nó đòi hỏi trình biên
dịch phải có sự phối hợp rất chặt
chẽ.
Kiến trúc truy nhập bộ nhớ
đồng nhất (UMA) chỉ phù hợp với các hệ
thống có ít CPU, khi số lượng CPU tăng lên sẽ
phải chi phí lớn cho vấn đề xử lý
chuyển mạch, một kiến trúc khác được
đề xuất là kiến trúc truy nhập bộ nhớ
không đồng nhất (NUMA). Giống như đa xử
lý đối xứng, đó là công nghệ mở rộng
tính khả biến của máy chủ bằng cách bổ sung
thêm bộ xử lý. Cả hai công nghệ này đều cho
phép người dùng bắt đầu với những máy
chủ tương đối nhỏ và sau đó bổ sung
bộ xử lý nếu ứng dụng phát triển thêm.
Đối với hầu hết máy chủ đối
xứng, việc bổ sung thêm sau khi đã có 8 bộ
xử lý rất đắt tiền mà hiệu suất
đạt được không cao nhưng NUMA thì cho phép
mở rộng hơn lên đến 256 bộ xử lý, liên
kết với nhau trong một máy. Tương tự hệ
thống UMA, NUMA cho phép khai thác sức mạnh kết
hợp của nhiều bộ xử lý mà mỗi bộ
xử lý truy cập một cụm bộ nhớ chung. Tuy
nhiên, các bộ xử lý được phân thành những
nhóm nhỏ hay nút, trong đó tất cả các bộ xử
lý đều liên kết với nhau. Chẳng hạn,
một máy chủ 16 bộ xử lý có thể sắp
xếp thành bốn nút, mỗi nút có bốn bộ xử lý
và có bộ nhớ riêng. NUMA làm giảm tình trạng tắc
nghẽn bus của kiến trúc đối xứng bằng
cách để cho các bộ xử lý trong một nút giao
tiếp với nhau và với bộ nhớ cục bộ
của chúng qua những bus riêng, nhỏ hơn. Các bộ
xử lý cũng có thể truy cập những vùng nhớ
của từng nút khác, tuy rằng thời gian truy cập
này thay đổi tùy theo khoảng cách giữa các nút, vì
thế cơ chế có tên là truy cập bộ nhớ không
đồng nhất NUMA. Trong hệ thống nhiều
bộ vi xử lý thuần nhất, mỗi đơn
vị xử lý trung tâm truy xuất vào bộ nhớ cục
bộ, vấn đề còn lại là việc trao
đổi thông tin giữa các bộ vi xử lý với nhau. Trong hệ thống nhiều bộ vi xử lý
không thuần nhất các máy tính được xây
dựng trên nền tảng của các bộ vi xử lý khác
nhau.
Xây dựng hệ thống nhiều máy
tính khá đơn giản, mỗi bộ xử lý sở
hữu không gian bộ nhớ riêng, vấn đề còn
lại cần phải giải quyết là việc trao
đổi thông tin giữa chúng với nhau. Giải pháp duy
nhất cho đến nay là các máy tính được
kết nối mạng, khi đó băng thông sẽ nhỏ
hơn rất nhiều so với cơ chế đọc/ghi
bộ nhớ, hơn nữa thông lượng trong mạng
cục bộ còn phụ thuộc vào hình trạng mạng,
các máy tính trong một vùng xung đột sẽ phải chia
sẻ kênh truyền vật lý. Trong mạng cục bộ,
nếu sử dụng đường truyền dạng bus
hoặc sử dụng hub để kết nối các máy
tính với nhau sẽ hình thành vùng xung đột, tại
mỗi thời điểm chỉ cho phép 01 máy tính
được gửi dữ liệu. Giải pháp tốt
hơn là đấu nối các máy tính theo hình sao sử
dụng thiết bị chuyển mạch, khi đó mỗi
cổng của bộ chuyển mạch là một vùng xung
đột, do đó không làm giảm băng thông của
mạng.
Phần cứng đóng vai trò quan
trọng trong hệ thống phân tán, nhưng phần
mềm còn đóng vai trò quan trọng hơn, sự hoạt
động của hệ thống hoàn toàn do phần
mềm quyết định. Phần mềm hệ
thống phân tán bao gồm hai loại: phần mềm
nền tảng hay còn gọi là hệ điều hành và
phần mềm ứng dụng.
Hệ điều hành cung cấp các tính
năng quản lý tài nguyên phần cứng, cho phép nhiều
người dùng và nhiều ứng dụng chia sẻ
phần cứng như: CPU, bộ nhớ, thiết bị
ngoại vi, mạng và tất cả các loại dữ
liệu. Hệ điều hành cũng đơn giản hóa
sự phức tạp và đa dạng của phần
cứng bằng cách tạo ra máy ảo, như vậy các
ứng dụng có thể thực hiện dễ dàng hơn.
Hệ điều hành cho các máy tính gồm hai loại, hệ
điều hành phân tán (DOS) và hệ điều hành mạng
(NOS). Hệ điều hành phân tán quản lý tổng
thể tất cả các máy tính thuần nhất trong hệ
thông phân tán, hệ điều hành mạng thường dùng
cho các hệ thống không đồng nhất, mỗi máy
tính tạo ra các dịch vụ cung cấp cho các máy tính khác.
Từ
cuối những năm 1990, một
số các dịch vụ do hệ
điều hành cung cấp đã được cải tiến và
gọi là phần mềm trung gian
Bảng 1.1
Hệ điều hành phân tán, hệ điều hành
mạng và phần mềm trung gian.
|
Hệ thống
|
Mô tả
|
Mục tiêu
|
|
Hệ điều
hành phân tán
|
Hệ điều
hành liên kết chặt dùng cho các hệ thống máy tính
thuần nhất
|
Che giấu và
quản lý các tài nguyên phần cứng
|
|
Hệ điều
hành mạng
|
Hệ điều
hành liên kết lỏng, dùng cho các máy tính không thuần
nhất (mạng LAN và mạng WAN)
|
Cung cấp các
dịch vụ cục bộ cho các máy tính khác truy nhập
từ xa.
|
|
Phần mềm
trung gian
|
Tầng trên
của hệ điều hành mạng, cài đặt các
dịch vụ mục đích chung.
|
Cung cấp tính
trong suốt cho hệ thống phân tán
|
Có hai loại
hệ điều hành phân tán, hệ điều hành phân tán
cho hệ thống nhiều bộ vi xử lý và hệ
điều hành phân tán cho các máy tính cùng chủng loại.
Ngoài khả năng quản lý nhiều bộ vi xử lý,
các tính năng khác của các hệ điều hành phân tán
cũng tương tự như hệ điều hành dành
cho các hệ thống chạy trên một bộ vi xử lý.
Mục tiêu chính
của loại hệ điều hành này là cho phép
người sử dụng và các phần mềm ứng
dụng truy nhập dễ dàng đến các tài nguyên dùng
chung như CPU, bộ nhớ chính, đĩa và các thiết
bị ngoại vi. Các phần mềm ứng dụng dùng chung
tài nguyên của hệ thống nhưng vẫn đảm
bảo tính độc lập cho từng ứng dụng,
như vậy hệ điều hành cần phải có chính
sách chia sẻ các tài nguyên dùng chung đó, điều này
chỉ có thể thực hiện bằng cách thiết
lập cơ chế máy ảo, cung cấp khẳ năng
xử lý đa nhiệm cho các ứng dụng. Ví dụ,
để giải quyết vấn đề tương
tranh trong hệ thống, các phần mềm ứng dụng
không được phép truy nhập trực tiếp
đến các tài nguyên mạng, việc truy nhập phải
được thực hiện thông qua các hàm nguyên thủy
do hệ điều hành cung cấp. Hệ điều hành
cần phải nắm toàn bộ quyền kiểm soát
việc sử dụng và chia sẻ tài nguyên phần
cứng, do đó hầu hết các bộ xử lý hỗ
trợ ít nhất hai chế độ:
-
Chế
độ lõi: Tất cả các chỉ thị được
phép thực hiện và có thể truy nhập toàn bộ
bộ nhớ và các thanh ghi trong thời gian thực
hiện.
-
Chế
độ của người sử dụng: Hạn
chế việc truy nhập thanh ghi và bộ nhớ, ví
dụ chỉ được phép truy nhập vào vùng nhớ
do hệ điều hành qui định, không truy nhập
trực tiếp vào các thanh ghi.
Hệ
điều hành cho nhiều bộ xử lý là các hệ
điều hành dùng để điều khiển sự
hoạt động của các hệ thống máy tính có
nhiều bộ xử lý, các hệ điều hành cho
nhiều bộ xử lý được chia thành hai
loại:
-
Đa xử
lý đối xứng: Bộ xử lý nào cũng có thể
chạy một loại tiến trình bất kỳ, các bộ
xử lý giao tiếp với nhau thông qua một bộ
nhớ dùng chung. Hệ đối xứng cung cấp
một cơ chế chịu lỗi và khả năng cân bằng
tải tối ưu hơn, vì các tiến trình của
hệ điều hành có thể chạy trên bất kỳ
bộ xử lý nào nên nguy cơ xảy ra tình trạng
tắc nghẽn ở CPU giảm đi đáng kể.
Vấn đề đồng bộ giữa các bộ
xử lý được đặt lên hàng đầu khi
thiết kế hệ điều hành cho hệ thống
đối xứng.
-
Đa xử
lý bất đối xứng: Hệ điều hành dành ra
một hoặc hai bộ xử lý để sử dụng
riêng, các bộ xử lý còn lại dùng để
điều khiển các chương trình của
người sử dụng. Hệ bất đối
xứng đơn giản hơn nhiều so với hệ
đối xứng, nhưng trong hệ này nếu có một
bộ xử lý trong các bộ xử lý dành riêng cho hệ
điều hành bị hỏng thì hệ thống có thể
ngừng hoạt động.
Hệ điều hành mạng là các hệ điều hành cài
đặt trên máy chủ để cung cấp các dịch
vụ như quản lý dữ liệu, người dùng,
bảo mật, các ứng dụng và các chức nẳng
mạng. Ngoài các chức năng cơ bản của
một hệ điều hành, các hệ điều hành
mạng còn phải thực hiện việc chia sẻ và
bảo vệ tài nguyên của mạng. Các hệ
điều hành Microsoft Server, Linux, Unix được
xếp vào loại hệ điều hành mạng, máy
chủ quản lý tài nguyên của mình để cung cấp
dịch vụ cho các máy khách. Hệ điều hành phân tán là
hệ điều hành được cài đặt trên các
máy tính khác nhau để tạo thành một cụm và
vận hành như một máy tính có cấu hình mạnh
hơn, ví dụ điển hình là sản phẩm LOCUS đã
được phát triển vào năm 1980. Mỗi máy tính
sở hữu CPU và bộ nhớ riêng, chúng liên kết không
chặt chẽ với nhau nhưng cho phép chia sẻ tà các
tập tin, người dùng có thể sử dụng các tập
tin không có trên máy tính của mình nhưng lại hiện
diện ở máy tính khác trong cụm.
Phần cứng cũng như hệ
điều hành cài đặt trên các thiết bị của
hệ thống phân tán quan hệ không chặt chẽ
với nhau, không cần phải có sự phối hợp
cộng tác ngoài việc tuân thủ qui tắc giao thức
khi trao đổi thông tin. Bước phát triển tiếp
theo là xây dựng phần mềm ứng dụng để
cài đặt trên các thành viên của hệ thống phân tán,
chúng phải gắn kết chặt chẽ với nhau
như một thực thể thống nhất chứ không
phải là một tập hợp các máy tính. Nói cách khác,
cần phải đảm bảo các máy tính phối hợp
với nhau và hoạt động như một máy tính ảo
với một bộ xử lý duy nhất, người dùng
không có cảm giác về sự tồn tại của
nhiều máy tính. Người dùng có thể thực hiện
các thao tác giống như trên máy tính của mình, họ có
thể mở tập tin, chạy chương trình…, như
vậy nếu chỉ tuân thủ các qui tắc về
truyền thông chưa đủ, cần phải có nhiều
tính năng khác nữa như vấn đề quản lý tiến
trình, thống nhất về giao diện trong môi
trường phân tán.
Trước khi thảo luận nguyên lý
của hệ thống phân tán cần thiết phải xem
xét các loại hệ thống phân tán, việc phân loại
hệ thống phân tán sẽ là cơ sở để phân
tích và lựa chọn giải pháp phù hợp để phát
triển hệ thống. Hệ thống phân tán gồm ba
loại, đó là các hệ thống điện toán phân tán,
hệ thống thông tin phân tán và hệ thống lan tỏa
phân tán.
Một trong những vấn đề
cơ bản của hệ thống phân tán là phải
đảm bảo vấn đề hiệu năng, tính
toán phân tán thường được sử dụng trong
các tác nghiệp yêu cầu hiệu năng cao. Hệ thống
điện toán phân tán chia thành hai nhóm: điện toán
cụm và điện toán lưới. Trong hệ thống điện
toán cụm, nền tảng phần cứng là tập
hợp các máy tính tương tự nhau, chúng
được cài đặt các hệ điều hành
giống nhau và kết nối với nhau qua đường
truyền tốc độ cao, thông thường là mạng
cục bộ. Ngược lại, hệ thống điện
toán lưới bao gồm các hệ thống phân tán
thuộc về nhiều miền quản lý khác nhau và
thường không đồng nhất về phần
cứng, phần mềm, hệ điều hành và các hệ
thống này có thể sử dụng những công nghệ
mạng khác nhau.
Giá thành máy tính ngày càng giảm trong khi
khả năng xử lý ngày càng tăng là cơ hội
để xây dựng hệ thống điện toán
cụm, các máy tính cá nhân được cài đặt
một loại hệ điều hành và kết nối
với nhau trong mạng tốc độ cao, điện
toán cụm sử dụng kỹ thuật xử lý song song
trên nhiều máy tính để tăng hiệu năng xử
lý cho các tác vụ. Một ví dụ khá quen biết của điện
toán cụm là hệ thống
Beowulf được xây
dựng dựa trên hệ điều hành Linux, mỗi cụm bao gồm nhiều
nút trong đó có một nút chủ đảm nhiệm
chức năng xắp đặt vị trí của các thành
viên khác trong chương trình song song, quản lý hàng
đợi các công việc và giao tiếp với
người dùng trong hệ thống. Như vậy, nút
chủ chỉ việc chạy phần mềm trung gian
cần thiết cho các chương trình thực hiện và
quản lý cụm, trong khi đó các nút tính toán sẽ không
cần gì khác ngoài hệ điều hành chuẩn. Một
thành phần quan trọng của phần mềm trung gian là
thư viện thực thi chương trình song song,
những thư viện này cung cấp các phương
tiện trao đổi thông tin dựa trên thông điệp
nhưng chưa có khả năng xử lý lỗi, bảo
mật...

Hình 1.1 Hệ thống điện
toán cụm
Một ví dụ khác
của điện toán cụm là hệ thống MOSIX được
xây dựng dựa trên cách tiếp cận đối
xứng, nghĩa là nó cung cấp một hình ảnh
đơn của hệ thống cụm. Độ trong
suốt rất cao của MOSIX đạt được
bằng cách di trú tiến trình, người dùng có thể
khởi tạo một tiến trình trên một nút nhưng
tiến trình đó có thể di trú sang nút khác để
thực hiện nhằm tận dụng tối đa
tiềm năng xử lý của mỗi nút trong hệ
thống.
Điện toán
lưới là mô hình tính toán dựa trên mạng để có
khả năng xử lý một lượng lớn dữ
liệu, một nhóm các máy tính phối hợp với nhau
để giải quyết vấn đề chung. Về
cơ bản, các máy tính liên kết với nhau để
giải quyết một vấn đề chung bằng cách
chia thành các đơn vị nhỏ hơn, chúng hình thành
một siêu máy tính ảo. Hệ thống điện toán
lưới không đòi hỏi tính đồng nhất
của tất cả các nút, mỗi thành viên có thể khác
về cả phần cứng lẫn hệ điều hành
và các chính sách quản lý.
Vấn đề cốt
lõi trong hệ thống điện toán lưới là
việc quản lý tài nguyên của các cơ quan khác nhau nhưng
phải cho phép các nhóm người dùng thuộc các cơ quan
cộng tác với nhau, như vậy sự cộng tác
đó được thực hiện dựa trên cơ quan
ảo, người dùng thuộc về một cơ quan
ảo thì có quyền truy nhập đến các tài nguyên
của cơ quan ảo đó. Với đặc tính đó,
nhiều phần mềm hệ thống điện toán
lưới phát triển xung quanh việc truy nhập tài
nguyên từ các vùng quản trị khác nhau cho người
dùng và ứng dụng thuộc
về một cơ quan ảo, do đó tiêu điểm
của hệ thống điện toán lưới thường
là những vấn đề liên quan tới mô hình hệ
thống.

Hình 1.2 Mô hình phân tầng
hệ thống điện toán toán lưới
Hình 1.2 thể hiện
mẫu mô hình phân tầng thường được
ứng dụng trong các hệ thống điện toán
lưới, mô hình này bao gồm bốn tầng:
-
Tầng ứng dụng
bao gồm các ứng dụng vận hành bên trong cơ quan
ảo và sử dụng môi trường điện toán
lưới.
-
Tầng tiếp
nhận: Xử lý các yêu cầu truy nhập đến
nhiều tài nguyên khác nhau, thường cung cấp các
chức năng như: thăm dò, định vị,
lập lịch truy nhập , nhân bản tài nguyên... Các giao
thức thuộc tầng này khá nhiều, để
đảm bảo cung cấp dịch vụ theo yêu cầu
của tầng ứng dụng nên chúng thường không
phải là những giao thức đã được
chuẩn hóa.
-
Tầng kết nối:
Bao gồm các giao thức truyền thông để hỗ
trợ cho các giao tác lưới bao trùm toàn bộ các tài
nguyên, ví dụ các giao thức truy cập để di
chuyển tài nguyên hoặc đơn giản chỉ là truy
cập tài nguyên từ một vị trí nào đó. Tầng
kết nối sẽ phải bao gồm các các giao thức
bảo mật, tính năng bảo mật có thể cho
một tài khoản và cũng có thể cho một ứng
dụng.
-
Tầng tài nguyên:
Quản lý tài nguyên đơn lẻ, nó sử dụng các
chức năng do tầng kết nối cung cấp và
gọi trực tiếp các giao diện tầng kết
cấu cung cấp để thực hiện các chức
năng điều khiển truy nhập, ví dụ các
chức năng thiết lập cấu hình tài nguyên,
khởi tạo tiến trình đọc/ghi dữ liệu.
-
Tầng thực
hiện: Cung cấp giao diện để truy nhập tài
nguyên cục bộ, các giao diện này được xây
dựng để có thể thích ứng với việc cho
phép chia sẻ tài nguyên bên trong một cơ quan ảo, nó
thường cung cấp các chức năng để truy
vấn trạng thái và khả năng của tài nguyên, các
chức năng quản lý tài nguyên thực.
Trong các hệ thống điện
toán lưới, tầng tiếp nhận, tầng kết
nối và tầng tài nguyên thường được
gộp lại và gọi chung là tầng trung gian, nó có
nhiệm vụ quản lý và cung cấp chức năng truy
nhập trong suốt đến tất cả các tài nguyên
phân bố trên các trang mạng khác nhau. Quan sát cho thấy,
việc cung cấp các thông tin riêng lẻ trong các hệ
thống điện toán khá phổ biến, điều này
đã dần dẫn tới quan điểm về mô hình
dịch vụ lưới mở.
Một trường
hợp khác trong hệ thống phân tán đó là các ứng
dụng mạng qui mô lớn, dữ liệu
được đặt ở nhiều nơi nhưng
việc xử lý ở mỗi nơi liên quan đến
những nơi khác. Trong
nhiều trường hợp, các máy chủ chạy
tiến trình cung cấp dịch vụ xử lý cho máy khách,
máy khách đơn thuần chỉ gửi yêu cầu và
nhận về kết quả đã được máy
chủ xử lý. Tuy nhiên một yêu cầu đặt ra là
cần phải có sự phối hợp xử lý giữa
các máy chủ, một yêu cầu được đưa ra
từ phía máy khách đến các máy chủ dữ liệu
thì yêu cầu đó phải được thực thi trên
tất cả các máy chủ hoặc chi cần một máy
chủ không thực thi được yêu cầu của máy
khách thì tất cả các máy chủ khác cũng không
được phép thực thi yêu cầu này.

Hình 1.3 Phần mềm trung gian là
phương tiện truyền tin
Các phần mềm ngày
càng tinh xảo hơn và chúng lần lượt tách chúng
thành các thành phần, ví dụ tách biệt thành phần
cơ sở dữ liệu
với thành phần xử lý, như vậy việc
tích hợp hệ thống phải cho phép các thành phần trao
đổi thông tin trực tiếp với nhau, từ đó
dẫn đến ngành công nghiệp lớp tích hợp
ứng dụng doanh nghiệp. Thực tế, các thao tác
thực hiện trong cơ sở dữ liệu thường
được thực hiện dưới dạng các giao
tác. Phần mềm ứng dụng càng tách biệt với dữ
liệu thì càng cần phải có các phương tiên
để tích hợp chúng độc lập với cơ
sở dữ liệu, đặc biệt các thành phần
ứng dụng phải có khả năng trao đổi
thông tin trực tiếp với nhau chứ không phải chỉ
là những phương tiện hỏi/đáp như trong
các hệ thống xử lý giao tác.
Các hệ thống
điện toán phân tán và hệ thống thông tin phân tán
đều có hình trạng ổn định, các nút mạng
cố định tại một vị trí địa lý và
kết nối với nhau qua đường truyền
chất lượng cao. Ở một mức độ nào
đó, tính ổn định này được thực
hiện bằng nhiều kỹ thuật khác nhau nhằm
đạt được tính trong suốt phân tán. Việc
sử dụng các kỹ thuật che giấu lỗi và
phục hồi sẽ cho chúng ta cảm giác thỉnh
thoảng mới có một vài lỗi xảy ra. Tương
tự như vậy chúng ta cũng có thể che giấu các
khía cạnh liên quan đến vị trí các nút trên mạng, nếu
lỗi xảy ra trên một nút nào đó thì người dùng
và các ứng dụng tin rằng các nút vẫn đang
hoạt động.
Tuy nhiên, vấn
đề trở nên phức tạp khi xuất hiện các
thiết bị di động và thiết bị nhúng, hệ
thống sẽ phải đương đầu với tính
không ổn định theo nghĩa cả hình trạng
lẫn tốc độ truyền dẫn. Các thiết
bị trong hệ thống loại này thường là
những thiết bị di động với đặc
trưng là tính không ổn định về vị trí
cũng như tốc độ truyền dẫn. Hệ
thống này thiếu vắng sự kiểm soát nhân công,
cấu hình của các thiết bị do chủ sở
hữu thiết bị qui định, nếu không thì
thiết bị sẽ tự động khám phá môi
trường và lựa chọn cấu hình phù hợp
nhất. Để sự lựa chọn được
chính xác nhất, Grimm đã đưa ra các yêu cầu sau cho
các hệ thống lan tỏa phân tán:
-
Bao quát những thay
đổi ngữ cảnh: Thiết bị phải liên
tục nhận biết được môi trường có
thể thay đổi bất kỳ thời gian nào, ví
dụ khi phát hiện thấy mất kết nối
mạng thì thiết bị sẽ tự động tìm
mạng khác thay thế.
-
Cung cấp giao diện cấu
hình mặc định: Mỗi người dùng có thói quen
riêng biệt, do đó cần phải cung cấp giao
diện cấu hình sao cho đơn giản nhất phù
hợp với tất cả mọi người hoặc
một cấu hình được cài đặt tự
động.
-
Tự động nhận
biết chia sẻ tài nguyên: Một khía cạnh quan trọng
của hệ thống lan tỏa là các thiết bị tham
gia hệ thống theo thứ tự truy nhập thông tin,
điều này đòi hỏi phải cung cấp các
phương tiện để dễ dàng đọc,
lưu trữ, quản lý và chia sẻ thông tin. Với quan
niệm việc kết nối mạng của các thiết
bị thường gián đoạn hoặc thay đổi
thì không gian lưu trữ thông tin có thể truy nhập
được cũng sẽ phải thay đổi theo
thời gian. Với sự hiện diện của khả
năng di động thì các thiết bị phải dễ
dàng thích nghi với môi trường cục bộ, chúng
phải có khả năng dễ dàng phát hiện các dịch
vụ và phản hồi theo các dịch vụ đó. Sự
trong suốt về mặt phân bố không chỉ ở trong
hệ thống lan tỏa mà thực tế còn ở sự
phân bố về dữ liệu, xử lý và điều khiển,
vì lẽ đó tốt hơn hết là phải phơi bày
chứ không nên che giấu chúng.
Cùng
với sự phát triển Internet vạn vật (IOT),
hệ thống lan tỏa phát triển ngày càng mạnh
mẽ, ví dụ hệ thống thiết bị trong gia dụng,
hệ thống chăm sóc sức khỏe, mạng cảm
biến..., khó có thể yêu cầu người dùng cài
đặt phần mềm trên những thiết bị này,
chúng phải được thiết kế sao cho có thể
tự động nhận biết được môi
trường xung quanh. Lượng dữ liệu thu
được từ các thiết bị này rất lớn,
giải pháp lắp đặt cho mỗi thiết bị
một bộ lưu trữ lên tới vài TB là không khả
thi, cho dù có giải quyết được vấn
đề lưu trữ thì vẫn gặp phải một
loạt những vấn đề khác, tùy từng hệ thống
cần phải xem xét các vấn đề sau:
-
Bảo mật tính riêng
tư của thông tin
-
Dữ liệu
được lưu trữ ở đâu và bằng cách nào
có thể khai thác được chúng
-
Các biện pháp phòng
chống mất mát dữ liệu quan trọng
-
Hạ tầng cần
thiết để tạo và lan tỏa các cảnh báo
-
Phương pháp
phản hồi và kiểm soát trực tuyến các thiết
bị
-
Sử dụng giải
pháp nào để triển khai một lượng rất
lớn các thiết bị
-
Giải pháp khắc
phục khi gặp sự cố về đường
truyền mạng
Đối
với các thiết bị gia dụng, vấn đề ưu
tiên hàng đầu là các thiết bị phải có khả năng
tự cấu hình quản lý và tính riêng tư của thông
tin, hệ thống chăm sóc sức khỏe lại
đặt vấn đề cảnh báo và phản hồi
trực tuyến là quan trọng, trong khi đó hệ
thống cảm biến lại phải đương
đầu với số lượng rất lớn các
thiết bị.
Điện
toán đám mây là xu hướng công nghệ quan trọng,
đó là một trong những thay đổi quan trọng
nhất trong cách xây dựng các hệ thống thông tin,
bản chất của nó là cung cấp các dịch vụ
tiện ích dựa trên nền tảng điện toán
lưới. Ý tưởng về điện toán đám mây
đã được Jcr Licklider đề xuất trong
một bài báo về “mạng máy tính giữa các thiên hà” vào
năm 1969, chỉ đến khi Internet băng thông rộng
phát triển mạnh mẽ thì
điện toán đám mây mới có những thành tựu đáng
kể. Một trong những cột mốc đầu tiên
cho điện toán đám mây là sự xuất hiện
của Salesforce.com vào năm 1999, tiên phong trong khái niệm
các ứng dụng doanh nghiệp cung cấp thông qua một
trang web đơn giản. Sự phát triển tiếp theo
là Amazon Web Services vào năm 2002, trong đó cung cấp
một bộ các dịch vụ dựa trên đám mây bao
gồm lưu trữ, tính toán và ngay cả trí tuệ nhân
tạo thông qua Amazon Mechanical Turk. Năm 2006, Amazon ra mắt
điện toán đám mây Elastic Compute là một dịch
vụ web thương mại cho phép các công ty nhỏ, cá nhân
thuê máy tính mà trên đó để chạy các ứng dụng
máy tính của mình. Năm 2009 đánh dấu một
bước tiến triển lớn, Google và các công ty khác
bắt đầu cung cấp các ứng dụng doanh
nghiệp dựa trên trình duyệt, dịch vụ như
Google Apps.
Về
cơ bản, điện toán đám mây và điện toán
lưới khá tương đồng với nhau, cả
hai đều cung cấp dịch vụ cho người dùng
bằng cách chia sẻ tài nguyên của mình để
thực hiện các tác vụ khác nhau. Tuy nhiên hai loại này
cũng có những điểm khác biệt cơ bản,
trong khi điện toán lưới ảo hóa các tài nguyên tính
toán lưu trữ dữ liệu thì điện toán đám
mây không cho phép người dùng truy nhập trực tiếp
vào tài nguyên, việc truy nhập được thực
hiện thông qua các dịch vụ trên nền tảng
Internet. Điện toán lưới chia một tác vụ
thành nhiều tác vụ nhỏ hơn để thực
hiện trên các máy tính khác nhau, điện toán đám mây
tạo ra một thể hiện mới cho người dùng
với tài nguyên riêng bằng cách cung cấp dịch vụ
cho người dùng đó. Điện toán lưới là tập
các tài nguyên máy tính từ nhiều vị trí khác nhau
để xử lý một tác vụ, đó là một hệ thống
chia sẻ tài nguyên cộng tác, các tài nguyên được
quản lý phân tán. Điện toán đám mây là một
dạng tính toán dựa trên tài nguyễn đã ảo hóa,
đặt ở các vị trí khác nhau trong một cụm và
được quản lý tập trung.
Không cần hệ
thống phân tán vẫn có thể trao đổi thông tin,
đơn giản chỉ cần sao chép dữ liệu vào
đĩa và chuyển sang máy tính khác, tuy nhiên công việc
đó không còn hợp với thời đại khi mạng
máy tính đã hiện diện ở khắp mọi nơi. Giờ
đây, người sử dụng chỉ cần ngồi
trước một máy tính hoặc sử dụng
điện thoại thông minh để trao đổi thông
tin tới mọi nơi trên thế giới. Cũng
giống như các phần mềm khác, khi sử dụng các
dịch vụ của hệ thống phân tán người
sử dụng luôn mong muốn có được các phần
mềm thân thiện, tốc độ xử lý nhanh, dễ
dàng cá nhân hóa các chức năng và đảm bảo an toàn
thông tin. Vì vậy khi thiết kế hệ thống phân tán
cần phải đảm bảo các mục tiêu sau:
-
Thân thiện
với người dùng: Tính thân thiện không những thể
hiện ở giao diện thuận lợi nhất mà còn
phải đáp ứng các yêu cầu về thông tin cho
người dùng. Hệ thống phải đảm bảo
tính tin cậy, thông tin phải chính xác và luôn sẵn sàng
đáp ứng yêu câu của người dùng.
-
Hiệu năng
hệ thống: Phải đảm bảo thời gian
đáp ứng khi người dùng đưa ra yêu cầu, nó
không phụ thuộc vào qui mô về không gian cũng như
số lượng người dùng. Cần chú ý đưa
ra các giải pháp hạn chế tối đa độ
trễ trên các kênh truyền vật lý, khắc phục
hiện tượng nút cổ chai hoặc nghẽn mạng.
-
Linh hoạt: Dễ dàng thay
đổi dịch vụ, có khả năng mở rộng
và di chuyển các thành phần cấu thành hệ thống
phân tán, tính chuyên môn hóa cao và khả năng tương tác
tốt giữa các thành phần trong hệ thống cũng
như các hệ thống phân tán khác.
-
Nhất quán: Thống nhất trong việc sử
dụng dịch vụ, dữ liệu trên toàn hệ
thống. Dữ liệu có thể phân tán ở nhiều
vị trí khác nhau, việc xử lý có thể thực
hiện trên các máy tính khác nhau nhưng luôn phải
đảm bảo tính nhất quán cho người dùng.
-
Chịu lỗi: Khi gặp lỗi,
hệ thống có thể tự khởi tạo lại
trạng thái tốt nhất và đồng thời
đảm bảo không mất mát thông tin, ở mức
độ cao hơn hệ thống có thể tự xử
lý các trường hợp lỗi.
-
An toàn và bảo mật thông tin: thông tin đáng tin
cậy, tránh mất mát và lộ thông tin của người
dùng, bảo vệ tốt hệ
thống kiểm soát truy nhập để đảm
bảo an ninh và an toàn cho hệ thống.
Mục tiêu quan trọng
nhất của hệ thống phân tán là đảm bảo
khả năng sẵn sàng của tài nguyên cho các dịch
vụ, làm sao để người sử dụng có
thể tiếp cận các tài nguyên đó một cách
thuận tiện nhất. Hệ thống phân tán phải
đảm bảo tính trong suốt, nghĩa là người
sử dụng không cần quan tâm tới những thao tác
xử lý bên trong mà chỉ cần quan tâm đến kết
quả yêu cầu và những yêu cầu đó phải
được thực hiện chính xác trong thời gian
ngắn nhất có thể. Tiếp theo là những mục
tiêu mang tính chất kỹ thuật, hệ thống phải
có khả năng mở rộng về qui mô, có khả
năng chịu lỗi,
khả năng bảo mật cao, dễ dàng nâng
cấp và bảo trì hệ thống.
Mục tiêu chính của hệ thống phân tán là kết
nối người sử dụng với tài nguyên hệ
thống, người sử dụng được tiếp
cận tài nguyên theo cách dễ dàng nhất mà không phụ
thuộc vị trí địa lý của người đó. Tài
nguyên ở đây có thể hiểu mọi thứ có
thể chia sẻ hoặc cung cấp dịch vụ, đó
có thể là tài nguyên phần cứng như máy in, máy tính, các
phương tiện lưu trữ..., và cũng có thể
đó là những dữ liệu cung cấp thông tin hữu
ích cho người sử dụng. Có nhiều lý do muốn
chia sẻ tài nguyên, lý do rõ ràng nhất là vì mục tiêu kinh
tế, người sử dụng có thể chia sẻ
phần cứng để tiết kiệm chi phí. Lý do
thứ hai đó là nhu cầu trao đổi thông tin, đó
có thể là những thông tin cộng tác trong công việc
hoặc có thể là những thông tin phục vụ cho
giải trí. Với việc phát triển mạnh mẽ
của mạng Internet, các hệ thống thương
mại điện tử ngày càng mở rộng,
người sử dụng có thể thực hiện các
công việc mà không nhất thiết phải hiện
diện tại nơi làm việc.
Tuy nhiên, khi nhu cầu kết nối và chia
sẻ tài nguyên ngày càng tăng thì vấn đề bảo
mật càng trở nên quan trọng, như vậy nảy
sinh hàng loạt vấn đề liên quan đến
việc khai thác và sử dụng tài nguyên như ai
được phép truy nhập, mức độ truy
nhập, thời gian được phép truy nhập,
tần suất truy nhập …. Thực tế cho thấy các
hệ thống ít được bảo vệ chống
lại những hiểm họa nghe trộm hoặc xâm
nhập dữ liệu được gửi trên mạng,
không mã hóa mật khẩu và thường lưu trong máy tính.
Xét về khía cạnh bảo mật sẽ có rất
nhiều công việc cần phải thực hiện, ví
dụ các giao dịch thương mại điện
tử người sử dụng chỉ cần nhập
vào số hiệu thẻ tín dụng, lẽ tất nhiên
sẽ cần thiết phải chứng minh đó thực
sự là chủ sở hữu thẻ. Một vấn
đề bảo mật khác là việc lưu vết
truyền thông để xây dựng hồ sơ thói quen
của người sử dụng, điều này vi
phạm tính riêng tư và nó đặc biệt nghiêm
trọng nếu như không thông báo cho người sử
dụng. Việc các thông tin rác trên mạng cũng gây khó
chịu cho người sử dụng, như vậy
cần phải thiết kế hệ thống sao cho có
thể lọc được
những thông tin dựa trên nội dung nhưng không ảnh
hưởng đến mục tiêu đảm bảo tính
sẵn sàng tài nguyên của hệ thống.
Mục tiêu quan trọng của hệ thống phân tán là
che giấu sự thật các tiến trình và tài nguyên phân tán
trên nhiều máy tính, một hệ thống phân tán có thể
tự trình diễn cho người dùng và các ứng dụng
như thể đang chạy trên một máy tính, đó
gọi là tính trong suốt. Tính trong suốt đối
với người sử dụng nhằm che giấu
vị trí thực của tài nguyên, người sử
dụng không biết tài nguyên ở đâu và xử lý trên máy
tính nào. Hệ thống phân tán gồm nhiều loại trong
suốt, người thiết kế hệ thống
cần phải trả lời cho câu hỏi cần
thiết phải trong suốt hay không và nếu có thì trong
suốt ở mức độ nào.
Tính trong suốt của hệ thống phân tán có thể
được áp dụng cho nhiều khía cạnh, theo tiêu
chuẩn của ISO 1995 tính trong suốt bao gồm các vấn
đề sau:
-
Truy nhập: Che giấu
việc thể hiện dữ liệu và cách truy nhập tài
nguyên.
-
Vị trí: Che giấu nơi
đặt tài nguyên của hệ thống.
-
Di trú: Che giấu
việc tài nguyên có thể di chuyển sang vị trí khác, khi
đặt lại vị trí tài nguyên không làm gián đoạn
hoạt động của hệ thống.
-
Nhân bản: Che giấu nhân
bản tài nguyên.
-
Tương tranh: Che
giấu việc chia sẻ tài nguyên cho nhiều người
đồng thời sử dụng.
-
Lỗi: Che giấu
lỗi và vấn đề phục hồi sau khi lỗi
xảy ra.
Trong suốt về truy nhập giải quyết vấn
đề che giấu những điểm khác biệt trong
việc thể hiện và cách thức người sử
dụng có thể truy nhập đến tài nguyên. Ở
mức cơ bản cần phải che giấu những
điểm khác biệt trong kiến trúc của các máy,
nhưng điều quan trọng hơn là phải
đạt được sự đồng thuận
về cách thể hiện trên các nền tảng khác nhau. Ví
dụ hệ thống phân tán không đồng nhất
gồm nhiều máy tính cài đặt các hệ điều
hành khác nhau, qui tắc đặt tên cho các tập tin cho
mỗi loại hệ điều hành tất nhiên cũng
sẽ khác nhau, như vậy cần phải che giấu
những điểm khác biệt này đối với
người sử dụng. Trong suốt về vị trí
thực chất là che giấu người sử dụng
nơi thực sự đặt tài nguyên, việc
đặt tên đóng vai trò rất quan trọng để
đạt được sự trong suốt về vị
trí. Việc gán các tên logic cho tài nguyên và được công
khai nhưng vẫn đảm bảo tính bí mật vị
trí của tài nguyên, ví dụ đường dẫn http://www.ptit.edu.vn
không thể hiện bất kỳ thông tin nào về vị
trí của máy chủ đang đặt trang web.
Tài nguyên có thể di chuyển trong hệ thống phân tán
mà không ảnh hưởng tới việc truy nhập thì có
thể nói rằng hệ thống đã đảm bảo
tính trong suốt về di trú, thậm chí hệ thống có
tính trong suốt về định vị lại vị trí
nếu tài nguyên chuyển sang vị trí khác trong khi
người sử dụng đang truy nhập mà không
hề bị gián đoạn. Ví dụ mạng di
động, người sử dụng có thể di
chuyển trong khi vẫn đang thực hiện các giao
dịch mà không hề bị mất kết nối mạng,
điều này càng chứng tỏ vai trò quan trọng
của tính trong suốt về đặt lại vị trí
trong các hệ thống phân tán. Để tăng tính sẵn
sàng của tài nguyên hoặc tăng hiệu năng hệ
thống người ta có thể áp dụng kỹ thuật
nhân bản tài nguyên, làm cho tài nguyên đến gần vị
trí truy nhập hơn, tính trong suốt trong nhân bản
giải quyết sự thật tồn tại nhiều
bản sao của tài nguyên. Để che giấu việc
nhân bản thì các bản sao phải cùng tên, như vậy
hệ thống cũng phải hỗi trợ tính trong
suốt về vị trí, nếu không sẽ không thể tham
chiếu đến các bản sao tại những vị trí
khác nhau.
Một trong những mục tiêu quan trọng của
hệ thống phân tán là cho phép chia sẻ tài nguyên, trong
nhiều trường hợp những tài nguyên đó
phải được chia sẻ theo cách cộng tác,
nghĩa là phải cho phép nhiều người đồng
thời sử dụng tài nguyên. Ví dụ cho phép chia sẻ
đường truyền, chia sẻ tập tin và dữ
liệu trên các máy chủ..., những trường hợp
đó điều quan trọng không được phép thông
báo cho người sử dụng tài nguyên đang bận,
hiện tượng này gọi là trong suốt về tương
tranh. Một vấn đề trong truy nhập tương
tranh đến tài nguyên chia sẻ phát sinh trạng thái
nhất quán, có thể đạt được tính
nhất quán thông qua cơ chế khóa, nghĩa là
người sử dụng sẽ được cấp
quyền truy nhập duy nhất được phép sử
dụng tài nguyên, điều này dẫn tới khái niệm
quản lý giao tác trong các hệ thống phân tán.
Một vấn đề quan trọng khác trong hệ
thống phân tán liên quan đến việc xử lý lỗi,
người sử dụng không cần biết lỗi gì
đã xảy ra mà chỉ cần quan tâm đến yêu
cầu của họ có thực hiện đúng hay không. Làm
cho hệ thống phân tán trong suốt về lỗi
nghĩa là không cần phải thông báo cho người
sử dụng biết đã có lỗi xảy ra và cách
phục hồi như thế nào, che giấu lỗi là
một trong những vấn đề khó khăn nhất
của hệ thống phân tán và thậm chí không thể
thực hiện được nếu như hệ
thống không lường hết các tình huống lỗi.
Khó khăn chính trong việc che giấu lỗi nằm ở
chỗ không có khả năng phân biệt giữa việc
không thể truy nhập tài nguyên và truy nhập tài nguyên
chậm, ví dụ trình duyệt gửi yêu cầu
đến máy chủ web nhưng quá thời gian vẫn không
thấy trả lời, trình duyệt sẽ thông báo lỗi
không có trang web, như vậy người sử dụng
không thể kết luận lỗi đã xảy ra trên máy
chủ hay mất kết nối mạng.
Mặc dù tính
trong suốt được xem như một trong những
mục tiêu của hệ thống phân tán, tuy nhiên trong
nhiều trường hợp sự che giấu quá mức
không phải là điều tốt. Ví dụ điển hình
là định dạng hiển thị thời gian, một
số nước sử dụng định dạng
DD/MM/YYYY nhưng cũng rất nhiều nước sử
dụng định dạng MM/DD/YYYY. Tương tự
như vậy, các hệ thống phân tán dựa trên nền
tảng của mạng máy tính, độ trễ của
mạng bao gồm trễ truyền dẫn và trễ xử
lý trên các thiết bị mạng, do đó việc trao
đổi thông tin giữa các máy tính chắc chắn sẽ
cần một khoảng thời gian nhất định.
Tính trong suốt càng cao thì đòi hỏi hệ thống
phải xử lý càng nhiều, điều này có thể
dẫn tới sự suy giảm hiệu năng của
hệ thống, do đó cần phải cân đối
giữa mức độ trong suốt và hiệu năng. Ví
dụ, trong các hệ thống thông tin phân tán, mỗi
cập nhật thực hiện trên một bản sao thì
sẽ phải lan tỏa đến tất cả các
bản sao khác, như vậy để đảm bảo
tính nhất quán sẽ thì thời gian thực hiện
sẽ lâu hơn, điều này không nên che giấu
người sử dụng, có thể hiển thị thông
báo giao dịch đang được thực hiện
hoặc thời gian dự kiến hoàn thành để
người sử dụng yên tâm chờ đợi. Một
ví dụ khác, khi người sử dụng muốn in
một tập tin, nên để người sử dụng
chọn máy in nào, không nên để hệ thống phân tán
tìm kiếm máy in nào đang rỗi để gửi yêu
cầu in.
Ví dụ cuối
cùng là trường hợp hệ thống nhân bản
nhưng có một bản sao nằm trên thiết bị
của người sử dụng, thông thường
bản sao trên thiết bị của người sử
dụng và bản sao trên máy chủ của hệ thống
phân tán phải được đồng bộ với
nhau, tuy nhiên vì nhiều lý do những dữ liệu này
chưa được đồng bộ, vì vậy không nên
che giấu người sử dụng những tình
huống này. Cũng có ý kiến cho rằng không nên che
giấu người sử dụng, khó có thể
đạt được sự trong suốt hoàn toàn
với người sử dụng cho nên sẽ tốt
hơn nếu phơi bày các vấn đề cho
người sử dụng biết để người
sử dụng hiểu và có biện pháp chủ động
xử lý. Tuy nhiên điều này lại ảnh hưởng
đến tính thân thiện của hệ thống
đối với người sử dụng. Như
vậy tính trong suốt là mục tiêu rất quan trọng
khi thiết kế và cài đặt hệ thống phân tán
nhưng cần phải xem xét vấn đề hiệu
năng và tính dễ hiểu cho người sử dụng,
để đạt được tính trong suốt hoàn
toàn có thể sẽ phải chi phí rất cao trong việc
xử lý bên trong hệ thống.
Tính mở của hệ thống phân tán
là khả năng cung cấp các dịch vụ theo qui
tắc chuẩn mô tả cú pháp và ngữ nghĩa của các
dịch vụ. Như vậy để đạt mục
tiên hệ thống có tính mở thì phải tuân thủ các
chuẩn giao tiếp đã được công bố,
nghĩa là sản phẩm của các nhà sản xuất khác
nhau có thể tương tác với nhau theo tập các
luật và các qui tắc đã được chuẩn hóa.
Ví dụ trong mạng máy tính, các qui tắc chuẩn
đề ra định dạng, nội dung và ý nghĩa
của các thông điệp gửi và nhận, những qui
tắc như vậy gọi là giao thức. Trong hệ
thống phân tán, các dịch vụ thường
được mô tả bằng ngôn ngữ định
nghĩa giao diện, nó thể hiện cú pháp của các
dịch vụ, nghĩa là xác định chính xác tên của
các hàm cùng với các tham số và giá trị trả về,
thậm chí mô tả cả các trường hợp lỗi
có thể xảy ra. Khó khăn nằm ở việc mô
tả chính xác các dịch vụ đó làm gì, đó là ngữ
nghĩa của các giao diện, trong thực tế những
đặc tính kỹ thuật này được công bố
không chính thức dưới hình thức ngôn ngữ tự
nhiên. Nếu mô tả chính xác, định nghĩa giao
diện sẽ cho phép tiến trình bất kỳ có thể tương
tác với tiến trình cung cấp giao diện này, nó cũng
cho phép các bên thực hiện cài đặt các giao diện
hoàn toàn khác nhau nhưng chúng vận hành giống hệt nhau.
Các đặc tả chính xác phải
đầy đủ và trung lập, tính đầy
đủ thể hiện tất cả những việc
cần phải thực hiện đều được
xác định rõ ràng, tuy nhiên nhiều đặc tả
chưa hoàn toàn đầy đủ và như vậy
người phát triển phải thêm những chi tiết,
tính trung lập thể hiện các đặc tả không qui
định cách cài đặt cụ thể cho mỗi giao
diện. Cả hai đặc tính này rất quan trọng
để hệ thống có khả năng tương thích
và khả năng dễ dàng chuyển đổi, khả
năng tương thích thể hiện việc cài
đặt các thành phần của những nhà sản
xuất khác nhau có thể cùng làm việc chỉ dựa trên
các dịch vụ của nhau như đã mô tả trong các
tiêu chuẩn chung. Khả năng dễ dàng chuyển
đổi đặc trưng cho mức độ mà người
phát triển trên các hệ thống khác nhau có thể tùy
biến cùng một dịch vụ đã cung cấp. Một
mục tiêu khác của tính mở trong hệ thống phân tán
là khả năng dễ dàng cấu hình hệ thống
từ các thành phần khác nhau, có thể dễ dàng thêm thành
phần mới hoặc thực hiện những thao tác
sửa đổi nhưng không ảnh hưởng
đến các thành phần khác, mục tiêu này gọi là
khả năng mở rộng của hệ thống. Một
hệ thống có khả năng mở rộng nghĩa là
có thể tương đối dễ dàng thêm các phần
chạy trên những hệ điều hành khác nhau, hoặc
thậm chí có thể thay thế toàn bộ hệ thống.
Những đặc điểm này đặc trưng cho
tính linh hoạt của hệ thống, tất nhiên thực
tế cho thấy việc đề ra những mục tiêu
như vậy rất dễ nhưng để thực
hiện các mục tiêu đó lại là chuyện khác.
Để đạt được tính
linh hoạt trong các hệ thống phân tán mở thì hệ
thống phải được tổ chức thành tập
các thành phần tương đối nhỏ, dễ thay
thế hoặc tương thích, điều này ngụ ý
không chỉ cung cấp định nghĩa cho các giao
diện mức cao nhất mà còn phải cung cấp
định nghĩa cho những thành phần bên trong của
hệ thống và mô tả chính xác các thành phần đó
tương tác với nhau như thế nào. Cách tiếp
cận này tương đối mới, nhiều hệ
thống cũ và ngay cả những hệ thống
hiện nay đều được xây dựng dựa
trên cách tiếp cận khối, nghĩa là các thành phần
tách biệt nhau về mặt logic nhưng lại
được cài đặt trong một chương trình
lớn, với cách tiếp cận này thì khó có thể thay
thế hoặc thích nghi thành phần mà không ảnh
hưởng đến toàn bộ hệ thống, các
hệ thống như vậy có xu thế đóng chứ
không có tính mở. Nguyên nhân phải thay đổi hệ
thống phân tán thường là do các thành phần không cung
cấp chính sách tối ưu cho người sử dụng
hoặc cho ứng dụng, điều cần thiết là
phải tách biệt giữa chính sách với các cơ
chế thực hiện, cần thiết phải triển
khai các tham số để người sử dụng có
thể tùy biến.
Kết nối
qua mạng Internet đã và đang nhanh chóng phủ khắp
mọi hoạt động trên toàn thế giới, như
vậy qui mô hệ thống là một trong những mục
tiêu quan trọng nhất trong thiết kế hệ
thống phân tán. Qui mô của một hệ thống có
thể đo bằng ba tiêu chí, tiêu chí thứ nhất là có
thể mở rộng hệ thống nhưng vẫn
dựa trên hạ tầng hiện có, nghĩa là có thể
dễ dàng thêm người sử dụng và tài nguyên vào
hệ thống nhưng không cần đầu tư thêm
trang thiết bị. Hệ thống phân tán cần phải
đảm bảo dễ dàng thêm các máy tính mà không cần
bất kỳ sửa đổi nào, số lượng máy
tính và số lượng người sử dụng
tăng thêm, như vậy chúng ta có thể mở rộng
hay thu hẹp hệ thống phân tán theo nhu cầu thực
tế, đây là tiêu chí quan trọng nhất trong thiết
kế qui mô của hệ thống phân tán. Tiêu chí thứ hai
là hệ thống có thể mở rộng theo phạm vi
địa lý, nghĩa là người sử dụng và tài
nguyên có thể nằm cách xa nhau nhưng ít ảnh
hưởng tới hiệu suất hoạt động
của hệ thống. Cả hai trường hợp
mở rộng trên cần phải bảo đảm
khả năng quản trị hệ thống và đó
cũng là tiêu chí thứ ba, hệ thống có thể mở
rộng qui mô quản trị,
vẫn có thể dễ dàng quản trị hệ
thống dù cho công việc quản trị này có thể do
nhiều đơn vị quản trị độc
lập thực hiện. Rất tiếc, hệ thống
mở rộng theo một hoặc cả ba tiêu chí trên
thường làm suy giảm hiệu năng hệ thống,
cân bằng giữa hiệu năng và qui mô cũng là vấn
đề cần phải xem xét kỹ lưỡng.
Khi cần
phải mở hệ thống thì cần phải giải
quyết một loạt vấn đề, ví dụ khi
mở rộng qui mô nhưng vẫn dựa trên nền
tảng hiện hành, nếu cần phải hỗ trợ
nhiều người dùng hoặc nhiều tài nguyên hơn
thì phải đương đầu với những
giới hạn của các dịch vụ, dữ liệu và
các giải thuật tập trung. Các dịch vụ tập
trung được cài đặt trên một máy chủ, rõ
ràng hiện tượng nghẽn cổ chai có thể
xảy ra, dù cho năng lực xử lý và lưu trữ
của máy chủ rất lớn thì băng thông kết
nối đến máy chủ cũng là trở ngại
lớn cho việc mở rộng qui mô. Rất tiếc
việc sử dụng một máy chủ đôi khi không
thể tránh được, ví dụ các dịch vụ
quản lý thông tin mức độ bí mật cao như tài
khoản ngân hàng, thuê bao điện thoại…, những
trường hợp này nên đặt máy chủ tại
nơi được bảo vệ nghiêm ngặt và tách
khỏi các bộ phận khác của hệ thống phân tán,
tạo bản sao tại vài vị trí để nâng cao
hiệu năng có thể không vướng mắc vấn
đề gì nhưng lại làm cho tính bảo mật
của dịch vụ kém hơn.
Lưu trữ
dữ liệu tập trung cũng tồi không kém gì các
dịch vụ tập trung, có thể đáp ứng không gian
lưu trữ cho hàng triệu bản ghi nhưng chắc chắn
đường truyền đến máy chủ cũng
sẽ bị bão hòa khi có nhiều người đồng
thời truy nhập. Ví dụ hệ thống phân giải
tên miền, cơ sở dữ liệu lưu trữ tên và
địa chỉ của các máy chủ trên toàn mạng
Internet, nếu tập trung dữ liệu trên một máy
chủ chắc chắn sẽ gây ra hiện tượng
tắc nghẽn. Cuối cùng là vấn đề giải
thuật tập trung, ví dụ bài toán định tuyến
trên mạng, dưới góc độ lý thuyết có thể
tìm ra đường đi tối ưu bằng cách thu
thập thông tin về tải trên tất cả các máy và các
kênh truyền sau đó tính toán tuyến đường
tối ưu, đây quả thực là một ý
tưởng rất tốt nhưng thực thi nó thì lại
rất tồi. Thông in về tải có thể lan truyền
trên toàn bộ hệ thống để cải thiện
vấn đề định tuyến, khó khăn ở
chỗ việc thu thập và vận chuyển các thông
điệp này lại làm tăng tải cho mạng.
Thực tế cho thấy nên tránh các giải thuật thu
thập thông tin từ nhiều nút để tính toán sau
đó gửi kết quả cho các nút khác, nên thay thế
bằng các giải thuật phi tập trung. Khác với
giải thuật tập trung, các giải thuật không
tập trung thường có những đặc điểm
sau:
-
Không một máy tính nào có đầy đủ thông tin
về trạng thái hệ thống.
-
Các máy tính ra quyết định chỉ dựa trên
thông tin cục bộ.
-
Lỗi xảy ra trên một máy sẽ không ảnh
hưởng đến các máy khác và do đó không làm hỏng
giải thuật
-
Không tồn tại đồng hồ chung cho toàn
bộ hệ thống
Đặc
điểm thứ tư sẽ được đề
cập chi tiết trong một chương riêng, các giải
thuật càn phải tôn trọng sự thật không thể
đồng bộ chính xác thời gian giữa các máy tính
trong hệ thống phân tán. Trong phạm vi mạng cục
bộ, việc đồng bộ thời gian có thể
đạt chính xác đến vài µs, nhưng điều này
sẽ không thể đạt được trên mạng
diện rộng, sẽ rất mạo hiểm nếu
sử dụng đồng hồ quốc gia hay đồng
hồ quốc tế.
Qui mô về địa lý chứa
đựng vấn đề riêng của nó, một trong
những lý do chính rất khó mở rộng qui mô về địa
lý cho những hệ thống phân tán được
thiết kế chạy trong mạng cục bộ là do chúng
dựa trên phương pháp truyền thông đồng
bộ, nghĩa là tiến trình trên máy khách sẽ bị phong
tỏa trong thời gian chờ kết quả trả
về từ tiến trình trên máy chủ. Giải pháp này nói
chung sẽ vận hành tốt trong mạng cục bộ,
nơi mà truyền thông giữa các máy tính chỉ vài µs.
Vấn đề sẽ hoàn toàn khác khi áp dụng cho
mạng diện rộng, truyền thông liên tiến trình có
thể kéo dài tới hàng trăm ms, nghĩa là chậm
hơn hàng ngàn lần so với mạng cục bộ, do
đó xây dựng các ứng dụng tương tác trong
mạng diện rộng đòi hỏi phải nỗ
lực rất lớn và cần thiết sự kiên nhẫn
để tìm ra hướng giải quyết các vấn
đề phát sinh.
Một vấn
đề lớn khác cản trở việc mỏ rộng
qui mô địa lý là vấn đề không tin cậy trong
các mạng diện rộng, và hầu như chỉ
thực hiện được các kết nối
điểm-điểm chứ không áp dụng
được phương pháp quảng bá hoặc
truyền tin theo nhóm. Ví dụ vấn đề xác
định dịch vụ trong mạng cục bộ
chỉ cần quản bá thông điệp đến các máy
để hỏi xem có chạy dịch vụ hay không, chỉ
những máy cung cấp dịch vụ mới trả
lời, cách làm này chắc chắn không áp dụng
được cho mạng diện rộng, như vậy
sẽ phải thiết kết dịch vụ định
vị đáp ứng yêu cầu cho hàng tỉ người
sử dụng trên toàn thế giới.
Qui mô về
địa lý cũng liên quan mạnh mẽ tới các
vấn đề của giải pháp tập trung, chúng
đều gây trở ngại cho việc mở rộng,
nếu hệ thống gồm nhiều thành phần tập
trung thì qui mô về địa lý sẽ bị giới
hạn về hiệu năng và những vấn đề
tin cậy phát sinh trong truyền thông trên mạng diện
rộng. Hơn nữa, các thành phần tập trung sẽ
dẫn đến sự lãng phí tài nguyên mạng,
tương tác của người sử dụng với
máy chủ sẽ phải đi qua nhiều thiết bị
định tuyến, rõ ràng việc xử lý tập trung
sẽ không thể đáp ứng yêu cầu mở rộng
qui mô về địa lý.
Câu hỏi
cuối cùng khá phức tạp, đó là làm sao có thể
mở rộng hệ thống phân tán cho nhiều miền
quản lý độc lập, vấn đề chính cần
giải quyết là mâu thuẫn về chính sách đối
với việc sử dụng tài ngyên, đó có thể là
chính sách về thanh khoản và quản lý hay vấn
đề bảo mật. Ví dụ về chính sách bảo
mật, người sử dụng có thể tin cậy vào
các thành phần của hệ thống phân tán thuộc cùng
một miền quản lý, quản trị hệ thống
có thể kiểm tra và chứng nhận cho các ứng
dụng và thậm chí có thể thực hiện các biện
pháp đặc biệt để bảo đảm các thành
phần không bị giả mạo, tuy nhiên niềm tin này
sẽ không thể mở rộng ra ngoài vùng quản lý. Nếu
hệ thống phân tán mở rộng sang vùng khác thì phải
thực hiện hai biện pháp bảo mật, thứ
nhất phải tự bảo vệ chống lại
tấn công phá hoại từ vùng mới, người
sử dụng của vùng mới có thể chỉ
được cấp quyền đọc tài nguyên,
thậm chí không cấp quyền truy nhập đến
một số tài nguyên cho người ngoài. Thứ hai, vùng
mới cũng phải tự bảo vệ trước các
cuộc tấn công phá hoại nhưng vẫn phải
đảm bảo cấp quyền truy nhập cho
người sử dụng thuộc vùng hiện hành.
Vấn
đề qui mô hệ thống phức tạp, nhưng quan
trọng hơn cần phải trả lời câu hỏi
bằng cách nào có thể giải quyết những vấn
đề này, hầu hết các trường hợp
đều dẫn đến vấn đề về
hiệu năng trong điều kiện hạn hẹp
về năng lực của mạng và các máy chủ.
Về cơ bản sẽ có ba kỹ thuật để
mở rộng qui mô, đó là các kỹ thuật che giấu
trễ truyền thông, kỹ thuật phân tán và kỹ
thuật nhân bản. Che giấu trễ truyền thông
đóng vai trò quan trọng trong việc mở rộng qui mô
về địa lý, thực chất đơn giản
chỉ là tránh chờ đợi kết quả trả
về từ các dịch vụ từ xa càng nhiều càng
tốt, nghĩa là bên gửi yêu cầu sẽ sử
dụng thời gian chờ đợi cho những công
việc hữu ích. Như vậy, chỉ có thể áp
dụng cơ chế truyền thông không đồng bộ
mới giải quyết được vấn đề
này, ngay khi nhận được kết quả trả
về sẽ tạm ngừng mọi công việc đang
thực hiện để tiếp tục xử lý yêu
cầu đã gửi trước đó.
Truyền thông
không đồng bộ thường được sử
dụng trong các hệ thống xử lý lô và trong các ứng
dụng xử lý song song, trong đó có thể lập
lịch thực thi cho các nhiệm vụ độc lập
trong khi chờ đợi hoàn thành truyền thông. Hoặc
giả có thể khởi tạo một luồng mới
để thực hiện yêu cầu, mặc dù nó bị
phong tỏa để chờ kết quả trả về
nhưng luồng khác của tiến trình vẫn có thể
tiếp tục thực hiện. Tuy nhiên nhiều ứng
dụng không thể thực hiện hiệu quả
truyền thông không đồng bộ, ví dụ trong các
ứng dụng tương tác, người sử dụng
sau khi gửi yêu cầu nói chung sẽ không làm gì hơn ngoài
việc chờ đợi kết quả trả về.
Trong những trường hợp này, giải pháp tốt
nhất là giảm thiểu truyền thông, nghĩa là
phải giảm tối đa thời gian xử lý trên máy
chủ cũng như lượng dữ liệu di
chuyển trên mạng, ví dụ có thể chuyển một
số chức năng xử lý trên máy chủ về máy
khách.

Hình 1.4 Thực
hiện tiền xử lý trên máy khách
Trường
hợp điển hình có thể thấy là các yêu cầu
truy nhập cơ sở dữ liệu sử dụng
cửa sổ trên máy khách, thông tin điền trên máy chủ
sẽ được chuyển thành các thông điệp
riêng cho mỗi trường để gửi đi và
chờ đợi kết quả xác nhận từ máy
chủ, máy chủ có thể kiểm tra lỗi cú pháp
trước khi tiếp nhật một mục dữ
liệu. Giải pháp tốt hơn sẽ là chuyển mã
điền thông tin vào cửa sổ và kiểm tra các thông
tin đó trên máy khách, để cho máy khách thực hiện
kiểm tra tính hợp lệ của thông tin, điều này
có thể thực hiện được bằng cách
sử dụng Javascript cho các cửa sổ trên trình
duyệt web.
Kỹ thuật
thứ hai là phân tán, nghĩa là một thành phần sẽ
được chia thành nhiều phần nhỏ hơn và
trải đều trên toàn bộ hệ thống. Ví dụ
điển hình là hệ thống tên miền của
mạng Internet, không gian tên được tổ chức
phân cấp thành các miền sau đó thành các khu vực,
mỗi máy chủ chỉ cần lưu giữ tên miền
trong khu vực phụ trách, phân giải tên miền thực
chất là trả về địa chỉ logic của máy
tính. Trang web là hệ thống thông tin dựa trên văn
bản, mỗi văn bản được xác
định bằng một tên duy nhất dưới
dạng đường dẫn URL, sử dụng URL giúp cho hệ
thống có thể mở rộng qui mô. Để phân
giải tên miền, máy khách phải gửi đường
dẫn đến máy chủ tên miền, do cấu trúc phân
cấp nên các yêu cầu sẽ không tập trung về
một máy chủ nên vẫn luôn đảm bảo hiệu
năng cho hệ thống. Việc mở rộng qui mô
thường làm suy giảm hiệu năng của hệ
thống, giải pháp tốt nhất là thực hiện nhân
bản, nhân bản không chỉ làm tăng tính sẵn sàng mà
còn cân bằng tải và như vậy hiệu năng có
thể sẽ tốt hơn, đối với các hệ
thống qui mô địa lý rộng lớn việc các
bản sao đặt ngay gần người sử
dụng sẽ giảm độ trễ truyền thông. Tuy
nhiên thực hiện nhân bản lại dẫn đến
vấn đề về nhất quán, có thể chấp
nhận tính nhất quán tới mức nào tùy thuộc vào
việc sử dụng tài nguyên, những giao dịch
thương mại điện tử đòi hỏi tính
nhất quán rất cao. Nhất quán mạnh đòi hỏi
các cập nhật phải được lan truyền ngay
lập tức đến tất cả các bản sao,
nghĩa là đòi hỏi cơ chế đồng bộ
trên toàn hệ thống, những kỹ thuật như
vậy rất khó triển khai trong các hệ thống
lớn. Dưới góc độ kỹ thuật, việc
mở rộng qui mô người sử dụng
được coi là đơn giản nhất, trong
một số trường hợp thập chí chỉ
cần tăng năng lực xử lý của máy chủ.
Mở rộng qui mô về địa lý sẽ phức
tạp hơn nhưng vẫn có thể kết hợp ba
kỹ thuật trên để giải quyết các vấn
đề về tính nhất quán. Mở rộng qui mô
về miền quản trị vẫn là vấn đề
phức tạp nhất vì phải giải quyết cả
những vấn đề phi kỹ thuật, ví dụ chính
sách của các đơn vị và sự cộng tác giữa
các nhân viên quản trị. Tuy nhiên có những tiến
bộ nhất định đã đạt được
trong vấn đề nhày, chỉ cần đơn
giản bỏ qua các vùng quản trị, ví dụ có thể
sử dụng kỹ thuật điểm-điểm
để người sử dụng đầu cuối
tự kiểm soát, tuy nhiên đó chỉ là một phần
trong việc giải quyết mở rộng qui mô quản
trị.
Phát triển các hệ thống phân tán là
công việc rất lớn, cùng một lúc phải cân
nhắc rất nhiều vấn đề và đó
đều là những vấn đề phức tạp. Tuy
nhiên vấn đề sẽ được giải
quyết nếu làm theo các nguyên tắc thiết kế và
tuân thủ nghiêm ngặt các mục tiêu đã đề ra.
Việc phát triển hệ thống trước hết
phải tuân theo những qui tắc của công nghệ
phần mềm, nhưng phải luôn lưu ý điểm
khác biệt cơ bản so với hệ thống tập
trung, các thành phần của
hệ thống giao tiếp với nhau qua mạng. Khi phát
triển hệ thống phân tán cần phải tránh
những quan niệm chưa đúng sau:
-
Mạng đáng tin cậy.
-
Mạng đã được bảo mật.
-
Mạng là hệ thống đồng nhất.
-
Hình trạng mạng không bao giờ thay đổi.
-
Độ trễ lưu chuyển dữ liệu trên
mạng bằng không.
-
Băng thông của mạng là vô hạn.
-
Chi phí vận chuyển bằng không.
-
Chỉ có một người quản trị.
Những vấn đề trên không
cần thiết phải để ý khi phát triển các
ứng dụng chạy độc lập trên một máy
tính, nhưng đó lại là những vấn đề cần
phải giải quyết khi phát triển hệ thống
phân tán. Mạng không đáng tin cậy đòi hỏi phải giải quyết vấn
đề trong suốt về lỗi truyền thông, vấn
đề bảo mật phải thực hiện bằng
chính sách mã hóa và xác thực…, như vậy có thể thấy
một lượng công việc rất lớn và phức
tạp khi phát triển các
hệ thống phân tán.
Hệ thống phân tán là tổ hợp
phức tạp các phần mềm vận hành trên nhiều
máy tính, để làm chủ các thành phần phức tạp
này cần phải tổ chức chúng một cách hợp lý,
có thể nhìn nhận cách tổ chức này từ góc
độ logic và vật lý. Tổ chức hệ thống
phân tán chủ yếu là các phần mềm tham gia vào hệ
thống, kiến trúc phần mềm cho biết các phần mềm được
tổ chức và tương tác với nhau như thế
nào. Triển khai thực tế hệ thống phân tán
đòi hỏi phải phác thảo và cài đặt các
phần mềm trên máy tính thực, có nhiều lựa chọn
để thực hiện công việc này, bản phác
thảo cuối cùng về kiến trúc phần mềm còn
gọi là kiến trúc hệ thống. Thông thường
hệ thống phân tán sử dụng hai kiến trúc,
kiến trúc tập trung và kiến trúc không tập trung. Trong
kiến trúc tập trung, hầu hết các thành phần
đều được đặt trên một máy chủ
và các máy khách truy nhập qua mạng để sử
dụng các dịch vụ, các máy trong kiến trúc không
tập trung đóng vai trò tương đương nhau.
Mục tiêu thiết kế hệ
thống phân tán là tách biệt phần ứng dụng
với nền tảng bằng cách cung cấp thêm tầng
trung gian, việc cài đặt thêm tầng trung gian đóng
vai trò quan trọng trong kiến trúc của hệ thống
phân tán và đó là mục tiêu chính để đảm
bảo tính trong suốt phân tán. Tuy nhiên việc cân bằng
giữa yêu cầu trong suốt sẽ dẫn đến
những kỹ thuật khác nhau để tầng trung gian
có khả năng thích nghi. Khả năng thích nghi trong
hệ thống phân tán có thể đạt được
bằng cách xây dựng hệ thống giám sát các hành vi và
thực hiện các biện pháp thích hợp khi cần
thiết, điều này dẫn tới khái niệm về
các hệ thống tự trị và các hệ thống này
thường được tổ chức dưới
dạng các vòng lặp kiểm soát hồi qui, nó tạo nên
phần tử kiến trúc trong việc
thiết kế hệ thống.
Cách tổ
chức phần mềm của hệ thống gọi là mô
hình kiến trúc của hệ thống phân tán, nó đóng vai
trò rất quan trọng trong thiết kế các hệ
thống lớn. Mô hình kiến trúc mô tả các thành phần
kết nối với nhau, cơ chế trao đổi thông
tin giữa chúng và cách cấu hình các thành phần với nhau
để đảm bảo tính toàn vẹn của hệ
thống. Thành phần là đơn vị mô đun với
các giao diện rõ ràng và có khả năng thay thế bên trong
môi trường mà không ảnh hưởng đến giao diện
của nó. Liên kết là cơ chế trung gian truyền thông
để các thành phần có thể phối hợp với
nhau, ví dụ như các phương tiện để
gọi thủ tục từ xa hoặc truyền thông
điệp. Sử dụng thành phần và các liên kết
giữa chúng sẽ cho cho những hình trạng khác nhau,
từ đó hình thành nên các dạng mô hình kiến trúc,
hệ thống phân tán gồm bốn mô hình sau:
-
Mô hình phân tầng
-
Mô hình dựa trên đối tượng
-
Mô hình dựa trên sự kiện
-
Mô hình dữ liệu tập trung
Mô hình kiến
trúc đóng vai trò quan trọng trong các hệ thống phân tán
vì chúng hướng tới tính trong suốt về phân
bố. Tuy nhiên trong suốt về phân bố đòi hỏi
phải cân bằng giữa hiệu năng, khả năng
chịu lỗi và thời gian phát triển hệ thống.
Không một kiến trúc nào có thể đáp ứng yêu
cầu cho tất cả các loại ứng dụng phân tán,
do đó cần phải phân tích và lựa chọn mô hình thích
hợp với yêu cầu của người sử
dụng.
Các thành phần trong mô hình phân tầng
được tổ chức thành từng tầng có sự
ràng buộc chặt chẽ với nhau, tầng trên gọi
các thành phần tầng dưới liền kề, đây
là mô hình đã được áp dụng để xây dựng
hệ thống mạng. Yêu cầu của bên gửi sẽ
được chuyển từ
tầng trên xuống tầng dưới, kết quả trả
về được chuyển từ tầng dưới
lên tầng trên. Nhận được yêu cầu, bên thực
hiện sẽ chuyển từ tầng dưới lên tầng
trên, kết quả trả về sẽ lại được
chuyển từ tầng trên xuống tầng dưới, từ
đó sẽ được chuyển qua mạng đến
tầng thấp nhất của bên gửi và lần lượt
chuyển qua các tầng cao hơn.

Hình 1.5 Mô hình phân tầng
Như vậy, số lượng tầng càng lớn thì
hệ thống sẽ càng được mô đun hóa cao,
tuy nhiên hiệu năng hệ thống có thể bị suy
giảm. Mô hình này đảm bảo tính chính xác rất cao,
chỉ cần xảy ra lỗi tại một tầng thì
coi như yêu cầu của bên gửi sẽ không được
thực hiện. Ưu điểm nổi bật của mô
hình này là khả năng nâng cấp, bảo trì cũng
như mở rộng tính năng của mỗi tầng sẽ
không ảnh hưởng đến các tầng khác.
Cùng với mô hình
phân tầng, mô hình đối tượng phân tán đóng vai
trò quan trọng trong các hệ thống phân tán lớn. Mô hình
đối tượng phân tán ràng buộc lỏng hơn mô
hình phân tầng, mỗi đối tượng được
coi là một thành phần và được kết nối
thông qua cơ chế gọi thủ tục từ xa. Các
đối tượng trong mô hình này hoạt động
tương đối độc lập, dễ dàng thay
đổi và nâng cấp, đây là mô hình được
đã được lựa chọn để triển
khai cho dịch vụ khách/chủ. Vì các đối tượng
gọi trực tiếp nên thời gian trễ thấp và do
đó rất phù hợp với những ứng dụng yêu
cầu thời gian thực. Tuy nhiên, nhược điểm
của nó nằm ở việc đối tượng gọi
không biết đối tượng bị gọi có sẵn
sàng đáp ứng yêu cầu dịch vụ hay không, nếu
quá nhiều đối tượng gửi yêu cầu đến
một đối tượng thì gây ra hiện tượng
quá tải. Một nhược điểm khác nữa cần
kể đến là hiện tượng phong tỏa bên gọi,
thời gian chờ đợi sẽ phụ thuộc vào thời
gian vận chuyển dữ liệu cộng với thời
gian xử lý yêu cầu, điều này có thể dẫn tới
hiện tượng lỗi quá thời gian.

Hình 1.6 Mô hình đối tượng phân tán
Mỗi đối tượng phân tán là
một thể hiện của lớp, điều này
giống như lập trình hướng đối
tượng, mỗi lớp có các thuộc tính và
phương thức xử lý, như vậy nó sẽ
dễ hiểu và dễ dàng nâng cấp khi cần thiết.
Ví dụ điển hình cho mô hình này là DCOM của Microsoft,
nó cho phép các ứng dụng dễ dàng trao đổi thông
tin với nhau trên môi trường mạng. Trong thực
tế, rất nhiều hệ thống phân tán đã
được xây dựng theo cách kết hợp mô hình phân
tầng và mô hình đối tượng phân tán.
Trong mô hình kênh sự kiện, về cơ
bản
các tiến trình trao liên lạc với nhau thông qua sự lan
tỏa các sự kiện, các sự kiện có thể mang
theo dữ liệu và thường được gắn với
các luật phân phát sự kiện. Các tiến trình phát tán sự
kiện sau khi đã được phần mềm trung gian
đảm bảo chỉ những tiến trình đã
đăng ký mới nhận được sự kiện.
Mức độ ràng buộc giữa các tiến trình của
mô hình này tương đối thấp, về nguyên tắc
thì các thành phần không cần phải tham chiếu đến
nhau, như vậy quan hệ giữa các thành phần có thể
coi như những cặp lỏng.

Hình 1.7 Mô
hình kênh sự kiện
Kênh sự
kiện thực chất là một tiến trình làm trung gian
cho các tiến trình khác trong hệ thống, nó có một tác
tử luôn theo dõi vận hành của các thành viên trong hệ
thống. Mỗi thành phần cung cấp dịch vụ
sẽ đăng ký với kênh sự kiện, khi một tiến
trình thành viên có yêu cầu dịch vụ, nó gửi
đến kênh sự kiện, kênh sự kiện sẽ
tiếp nhận và tìm kiếm tiến trình có thể đáp
ứng yêu cầu và kết nối các thành viên đó
để trao đổi với nhau. Như vậy đây
là mô hình rất phù hợp cho các hệ thống có khả
năng phân tải và dự phòng nóng.
Ba mô hình
đã đề cập trên đòi hỏi các tiến trình
cung cấp dịch vụ luôn phải ở trạng thái
hoạt động, hơn nữa nếu lượng
dữ liệu lớn có thể dẫn tới hiện
tượng quá thời gian. Mô hình dữ liệu tập
trung phát triển dựa trên ý tưởng các tiến trình
trao đổi thông tin với nhau qua kho dữ liệu chung
theo phương thức chủ động hoặc thụ
động. Mô hình này đảm bảo tính độc
lập giữa các thành phần trong hệ thống và
đồng thời tiện lợi cho việc chia sẻ
dữ liệu lớn.

Hình 1.8 Mô
hình dữ liệu tập trung
Mô hình kênh
sự kiện có thể kết hợp với mô hình dữ
liệu tập trung để hình thành nên các không gian dữ
liệu chia sẻ, các tiến trình ràng buộc lỏng,
chúng không cần phải đồng thời ở trạng
thái hoạt động. Hơn nữa nhiều không gian dữ
liệu chia sẻ sử dụng giao diện tương
tự như SQL để truy nhập kho dữ liệu và
như vậy có thể truy nhập bằng cách sử
dụng mô tả chứ không cần phải tham chiếu,
ví dụ điển hình là hệ thống chia sẻ
tập tin.
Hệ thống phân tán có thể được
xây dựng theo kiến trúc tập trung, không tập trung hoặc
lai ghép hai loại trên. Kiến trúc tập trung còn gọi là
kiến trúc dọc, các công việc xử lý được
thực hiện bằng cách đặt các máy tính lớn
theo cấu trúc phân tầng, các tiến trình xử lý
được phân cho các tầng thấp hơn
tương ứng với cấu trúc tổ chức và loại
nhiệm vụ. Kiến trúc không tập trung còn gọi là kiến
trúc ngang, nhiều máy tính được kết nối ngang
hàng vào mạng để xử lý công việc, có thể
thêm máy tính nhằm nâng cao độ
linh hoạt và nâng cấp hệ thống. Các công việc
trước kia được tập trung trên một máy
tính thì có thể chia sẻ với các máy tính khác. Có thể sử
dụng các thư viện được cung cấp từ
các máy tính khác, điều này đảm bảo được
sự phân tán chức năng và sử dụng chung các nguồn
tài nguyên.
Mặc dù còn có nhiều điểm khác biệt
trong cách nhìn nhận những vấn đề của hệ
thống phân tán, các nhà nghiên cứu cũng như những
người làm thực tế đều nhất trí lấy
trường hợp máy khách yêu cầu dịch vụ từ
máy chủ đề hiểu và quản lý sự phức tạp
của hệ thống phân tán. Trong mô hình khách/chủ cơ
bản, các tiến trình trong hệ thống phân tán chia làm
hai nhóm, tiến trình máy chủ cài đặt một dịch
vụ cụ thể và tiến trình máy khách yêu cầu dịch
vụ từ máy chủ bằng cách gửi yêu cầu sau
đó chờ đợi kết quả trả về. Mô
hình khách/chủ đang
được áp dụng phổ biến trong các hệ thống
phân tán, hiện nay mô hình này đã phát triển theo hướng
sử dụng các đối tượng phân tán. Mô hình
khách/chủ được hiểu là hình thức trao đổi
thông tin giữa các tiên trình cung cấp dịch vụ và tiến
trình sử dụng dịch vụ, máy khách yêu cầu các dịch
vụ đã được cài đặt trên máy chủ, máy
chủ xử lý yêu cầu và trả về kết quả
cho máy khách.

Hình 1.9
Tương tác khách/chủ
Cơ chế truyền tin sử dụng
truyền thông liên tiến trình, có thể sử dụng cả
hai loại giao thức truyền thông có liên kết và không
liên kết, thông thường giao thức không liên kết
được sử dụng trong các mạng có độ
tin cậy cao, sử dụng giao thức không liên kết có
ưu điểm về hiệu năng. Nếu các thông
điệp không bị thất lạc hoặc lỗi thì
giao thức hỏi/đáp sẽ làm việc rất tốt,
rất tiếc việc thực hiện giao thức này thỉnh
thoảng gặp phải lỗi truyền thông, nếu không
thấy phản hồi thông thường máy khách sẽ phải
gửi lại. Vấn đề nằm ở chỗ máy
khách không thể phát hiện thông điệp bị thất
lạc hay thông điệp gặp lỗi truyền thông, nếu
thông điệp kết quả trả về bị thất
lạc thì mà máy khách gửi lại yêu cầu thì sẽ xảy
ra hiện tượng lặp. Việc lặp yêu cầu có
thể làm tổn hại thông tin trong hệ thống, máy
khách hoặc máy chủ không thể tự giải quyết
những trường hợp này, cần thiết phải
xây dựng cơ chế phối hợp giữa các bên tham
gia. Giao thức có liên kết thường được sử
dụng trong mạng diện rộng, hiệu năng có thể
bị suy giảm vì phải thiết lập và hủy bỏ
liên kết trước và sau khi truyền thông điệp,
tuy nhiên nó khắc phục nhược điểm không tin cậy
trong mạng diện rộng. Mô hình khách/chủ đóng vai trò quan trọng trong các
hệ thống phân tán, nó có các đặc trưng sau:
-
Máy khách và máy
chủ là các mô đun chức năng với các giao diện
xác định: Các chức năng thực hiện của
máy khách hoặc máy chủ có thể gồm nhiều
chức năng con, việc cài đặt các ứng
dụng máy khách hoặc máy chủ không nhất thiết phải
trên máy chủ mà có thể cài đặt tại bất
cứ máy nào trên mạng.
-
Quan hệ
khách/chủ được thiết lập giữa hai mô
đun khi máy khách đưa ra yêu cầu dịch vụ và
được máy chủ đáp lại: Khái niệm máy
khách và máy chủ chỉ là tương đối, một
mô đun có thể đóng vai trò máy chủ đối
với mô đun này nhưng lại đóng vai trò máy khách
đối với mô đun khác.
-
Trao
đổi thông tin giữa các mô đun được thực
hiện thông qua có chế truyền thông điệp: tất
cả các yêu cầu của máy khách được tập
hợp thành thông điệp để chuyển đến
máy chủ và ngược lại các kết quả trả
về cũng được đặt trong các tin báo
để chuyển đến máy khách.
-
Trao
đổi thông điệp giữa máy khách và máy chủ
thường được thực hiện theo cơ
chế hỏi/đáp.
-
Máy khách và máy
chủ được cài đặt trên các máy tính khác nhau
và được nối với nhau trên mạng: Về
mặt lý thuyết, trên cùng một máy có thể cài
đặt đồng thời mô đun khách và mô đun
chủ, tuy nhiên trong thực tế thường các
mô-đun này được cài đặt trên các máy khác nhau.
|
Tiến trình Máy khách
|
Giao
thức trao đổi lớp trên
|
Tiến trình Máy chủ
|
|
Phần mềm trung gian Máy khách
(MiddleWare)
|
Phần mềm trung gian Máy chủ
(MiddleWare)
|
|
Dịch vụ cục bộ
|
Dịch vụ mạng
|
Dịch vụ mạng
|
Dịch vụ cục bộ
|
|
Hệ điều hành và thiết
bị phần cứng
|
Hệ điều hành và thiết
bị phần cứng
|
|
|
Trao
đổi thông tin tầng vật lý
|
|
|
|
|
|
|
Hình 1.10 Các
thành phần cơ bản trong mô hình khách/chủ
Với các đặc điểm trên, mô
hình khách/chủ có thể cài đặt theo hai mức, mức
dịch vụ nền và mức ứng dụng. Mức
dịch vụ nền tạo cơ sở để phát
triển, hỗ trợ và quản lý các ứng dụng khách/chủ
trong khi đó mức ứng dụng cung cấp các chức
năng nghiệp vụ. Mô hình khách/chủ cung cấp các
phương tiện tích hợp các ứng dụng riêng với
các nhu cầu xử lý nghiệp vụ chung để đảm
bảo thống nhất việc xử lý thông tin trong toàn bộ
hệ thống, mô hình này có các ưu điểm sau:
-
Chia sẻ
dữ liệu: Dữ liệu được lưu trên máy
chủ để sẵn sàng cung cấp cho tất cả
những người sử dụng được
quyền truy nhập. Việc sử dụng ngôn ngữ SQL
để thống nhất các thao tác truy xuất đã
hỗ trợ cho người sử dụng dễ dàng truy
nhập dữ liệu.
-
Các dịch
vụ tích hợp: Người sử dụng hợp pháp
đều có thể nhận được thông tin cần
thiết từ các máy khách và có thể xử lý các thông tin
này theo nhu cầu sử dụng. Theo quyền truy nhập, máy
khách sử dụng chung các dịch vụ do máy chủ cung
cấp.
-
Chia sẻ tài
nguyên giữa các hệ thống khác nhau: Có thể tạo
các ứng dụng độc lập với hệ
điều hành và thiết bị phần cứng, do đó
các ứng dụng máy khách đều có thể sử
dụng các tài nguyên chung trên mạng như dữ liệu,
dịch vụ....
-
Khả
năng trao đổi và tương thích dữ liệu:
Hầu hết các công cụ
sử dụng để phát triển các sản phẩm
theo mô hình khách/chủ đều dựa trên tiêu chuẩn
của ngôn ngữ SQL, do đó đảm bảo
được tính tương thích và khả năng trao
đổi dữ liệu giữa các tiến trình máy khách và
máy chủ.
-
Không phụ
thuộc thiết bị lưu trữ dữ liệu: Trên máy
chủ, dữ liệu có thể được lưu
trữ trong các thiết bị khác nhau như đĩa
từ hoặc băng từ, người sử dụng
vẫn dùng tập các lệnh chung để truy xuất
dữ liệu mà không phụ thuộc vào phương
tiện lưu trữ.
-
Độc
lập với vị trí xử lý dữ liệu: Việc truy xuất dữ
liệu không phụ thuộc vào thiết bị phần
cứng, hệ điều hành và vị trí lưu trữ
dữ liệu.
-
Quản lý
tập trung: Việc quản lý tập trung được
thực hiện bằng cách sử dụng các công cụ
giám sát và hỗ trợ từ trung tâm.
Các thành phần cơ bản trong mô hình
khách/chủ bao gồm tiến trình máy khách, máy chủ, phần
mềm trung gian, dịch vụ mạng, dịch vụ cục bộ/dịch
vụ mạng để quản lý dữ liệu và quản
lý tiến trình, hệ điều hành và thiết bị phần
cứng. Tiến trình máy khách bao gồm các chức năng của
lớp ứng dụng, nó thực hiện giao tiếp với
người sử dụng và các chức năng ứng dụng
cần thiết như hiển thị thông tin, tính toán các bảng
tính... Tiến trình máy khách giao tiếp với các phần mềm
trung gian qua giao diện lập trình ứng dụng để
gửi các yêu cầu đến máy chủ và nhận kết
quả trả về. Tiến trình máy chủ thực hiện
các chức năng tầng ứng dụng, nó cung cấp các
dịch vụ cho máy khách với việc che giấu các thông
tin riêng, đảm bảo cung cấp các dịch vụ xử
lý lỗi và có thể thực hiện chức năng giám
sát/điều phối.
Phần mềm trung gian cung cấp nhiều
tính năng khác nhau như thiết lập phiên làm việc giữa
các tiến trình, bảo mật dữ liệu, nén/giải
nén dữ liệu, xử lý lỗi. Tầng trung gian đóng
vai trò kết nối tiến trình máy khách với tiến
trình máy chủ, nó giao tiếp với các tiến trình qua giao
diện lập trình ứng dụng. Phần mềm trung
gian trên máy khách thực hiện các chức năng cung cấp
giao diện lập trình ứng dụng, thiết lập
liên kết với tiến trình trên máy chủ bằng cách gửi
các lệnh thông qua giao diện mạng và phần mềm
trung gian của máy chủ. Phần mềm trung gian trên máy chủ
giám sát các yêu cầu từ phía máy khách và gọi các tiến
trình máy chủ tương ứng, nó tiếp nhận các yêu
cầu từ phía máy khách và chuyển các yêu cầu đó cho
tiến trình máy chủ, kiểm tra bảo mật hệ thống,
xử lý tương tranh khi đồng thời nhận
được nhiều yêu cầu từ phía máy khách, nhận
kết quả xử lý của tiến trình máy chủ để
trả về tiến trình trên máy khách, giám sát và xử lý lỗi.
Mô hình khách/chủ là chủ đề của
nhiều cuộc tranh luận về việc làm rõ khái niệm
khách/chủ, một tiến trình là chủ đối đối
với máy khách này nhưng lại có thể là khách đối
với tiến trình chủ khác, ví dụ khi tiếp nhận
một yêu cầu từ máy khách tiến trình máy chủ có thể
lại gọi dịch vụ từ máy chủ khác. Tuy nhiên
khi xem xét nhiều ứng dụng truy nhập dữ liệu,
hầu hết mọi người đều nhất trí
phân biệt ba mức và gọi là kiến trúc phân tầng,
đó là mức giao tiếp với người sử dụng,
mức xử lý và mức dữ liệu. Mức giao diện
người sử dụng chứa những thao tác cần
thiết để giao tiếp trực tiếp với
người sử dụng, ví dụ như hiển thị
các tính năng quản lý. Mức xử lý thường chứa
các ứng dụng nghiệp vụ trong khi đó mức dữ
liệu mới thực sự quản lý và thao tác trực
tiếp với dữ liệu. Thông thường máy khách cài
đặt mức giao diện người sử dụng,
đó là các chương trình cho phép người sử dụng
tương tác với các ứng dụng, có những điểm
khác biệt đáng kể trong các chương trình giao diện
người dùng phức tạp. Giao diện đơn giản
nhất là màn hình hiển thị tương tác dạng ký tự,
đó là giao diện phổ biến trong các môi trường
giao tiếp với tiến trình máy chủ, ví dụ như
các giao diện của các ứng dụng quản lý thiết
bị/máy chủ. Trước đây đầu cuối của
người sử dụng có thể chỉ gồm các chức
năng hiển thị mà không có chức năng xử lý, hiện
nay giao diện của người sử dụng đã
được cải thiện đáng kể, người
dùng đã có thể sử dụng giao diện đồ họa
để tương tác với máy chủ. Trong giai đoạn
đầu phát triển hệ thống phân tán nên cung cấp
các giao diện thể hiện bốn thao tác cơ bản của
người sử dụng đối với dữ liệu,
những giao diện này có thể chưa thực sự thân
thiện nhưng nó đảm bảo tính chính xác cho các nghiệp
vụ xử lý, thời gian đưa các sản phẩm
vào khai thác cũng sẽ được rút ngắn. Nhiều
ứng dụng khách/chủ được xây dựng dựa
trên ba thành phần, thành phần tương tác với
người sử dụng, thành phân truy nhập dữ liệu
và ở giữa hai thành phần trên là thành phần xử lý
nghiệp vụ.

Hình 1.11 Tổ
chức phân tầng máy tìm kiếm trên Internet
Khác với thành phần giao diện
người sử dụng và thành phần truy nhập dữ
liệu, thành phần xử lý nghiệp vụ thường
không có những khía cạnh chung, mỗi dịch vụ cụ
thể sẽ có những yêu cầu xử lý riêng. Ví dụ
về ứng dụng tìm kiếm trên mạng Internet, bỏ
qua các ảnh và những thứ tô điểm cho trang tìm kiếm
thì giao diện sẽ chỉ còn là phần nhập nội
dung và sau đó là phần hiển thị kết quả tìm
kiếm. Phía sau của trang tìm kiếm đó là cả một
cơ sở rất lớn chứa đường dẫn
đến các trang web và chúng đều được
đánh chỉ mục, lõi của máy tìm kiếm là một
chương trình chuyển đổi xâu ký tự tìm kiếm
thành một hoặc nhiều truy vấn cơ sở dữ
liệu sau đó sắp xếp theo thứ bậc và chuyển
thành định dạng HTML để hiển thị trên
các trình duyệt, như vậy những công việc này sẽ
được đặt vào tầng xử lý nghiệp vụ.
Mức dữ liệu trong mô hình khách/chủ
chứa các chương trình duy trì dữ liệu thực
để các ứng dụng có thể vận hành, dữ liệu
ở đây thường là bền vững, kể cả
không một ứng dụng nào chạy thì dữ liệu vẫn
được lưu để phục vụ cho lần sử
dụng kế tiếp. Dạng đơn giản nhất
là hệ thống tập tin, nhưng thông thường thì
được tổ chức thành cơ sở dữ liệu,
tromg mô hình khách/chủ mức này thường cài đặt
tại phía máy chủ. Bên cạnh nhiệm vụ chính
lưu trữ dữ liệu, mức dữ liệu có trách
nhiệm duy trì tính nhất quán
cho các ứng dụng khác nhau. Khi đang sử dụng
cơ sở dữ liệu, việc duy trì tính nhất quán
nghĩa là phải đảm bảo các mô tả và ràng buộc
dữ liệu, ví dụ có thể phát ra những cảnh
báo khi thấy dữ liệu vượt ngưỡng
đã qui định trước. Hầu hết các hệ
thống hiện nay đều sử dụng cơ sở
dữ liệu quan hệ, sự độc lập dữ
liệu rất quan trọng, dữ liệu được
tổ chức độc lập với ứng dụng và
như vậy việc thay đổi tổ chức dữ
liệu sẽ không ảnh hưởng đến các ứng
dùng và ngược lại việc thay đổi các ứng
dụng cũng không ảnh hưởng đến việc
tổ chức dữ liệu. Sử dụng các cơ sở
dữ liệu quan hệ trong mô hình khách/chủ giúp tách biệt
nức xử lý với mức dữ liệu, do đó có thể
coi công việc xử lý và dữ liệu độc lập
với nhau. Cơ sở dữ liệu quan hệ không phải
là lựa chọn lý tưởng, nhiều ứng dụng
hoạt động trên những loại dữ liệu phức
tạp và được mô hình hóa thành các đối tượng
thay cho các quan hệ, ví dụ thể hiện các đa giác
và các hình tròn trong các hệ thống thiết kế trợ
giúp máy tính. Trong những trường hợp này, các thao tác
dữ liệu thường thể hiện bằng khái niệm
thao tác với đối tượng, những cơ sở
dữ liệu như vậy gọi là cơ sở dữ
liệu hướng đối tượng hay cơ sở
dữ liệu quan hệ đối tượng.

Hình 1.12 Tổ
chức phân chia xử lý trong kiến trúc hai bên
Phân biệt ba mức logic như trên, giả
thiết số khả năng phân tán vật lý ứng dụng
khách chủ trên nhiều máy, cách tổ chức đơn giản
nhất là máy khách chứa các chương trình cài đặt
giao diện người sử dụng và máy chủ thực
hiện mức nghiệp vụ và mức truy nhập dữ
liệu. Với cách tổ chức như vậy thì máy chủ
thực hiện mọi công việc và về bản chất
thì máy khách vẫn chỉ là đầu cuối câm, có
chăng chỉ là vài công việc giao diện đồ họa.
Có nhiều khả năng lựa chọn cài đặt khác
để phân phối nhiệm vụ giữa tiến trình
trên máy khách, một trong các cách tiếp cận là phân tán các
chương trình trong tầng ứng dụng trên các máy khác
nhau.

Hình 1.13 Máy
chủ đóng vai trò máy khách
Trước hết cần phân biệt
hai loại máy khách và máy chủ, gọi là kiến trúc hai
bên, máy khách chỉ thực hiện xử lý mức giao diện
như một đầu cuối câm nhưng đồng thời
cũng có thể thực hiện một số thao tác của
mức nghiệp vụ và mức dữ liệu. Tất
nhiên các chức năng của mức nghiệp vụ và mức
dữ liệu chuyển về cho máy khách không phải là giải
pháp tốt, đơn giản vì như vậy việc quản
lý sẽ khó khăn hơn rất nhiều. Ngoài ra, việc
chuyển các chức năng của các mức này về máy
khách sẽ làm cho hệ thống phụ thuộc nhiều
hơn vào máy khách, thông thường chỉ nên xây dựng ứng
dụng cho máy khách ở mức độ 1 đến 3. Xử
lý phía máy chủ có xu thể chuyển sang nhiều máy tính,
máy chủ cũng có thể đóng vai trò như máy khách, giải
pháp này gọi là kiến trúc ba bên. Trong kiến trúc này, các
chương trình hình thành mức xử lý nghiệp vụ
chạy trên các máy chủ riêng biệt nhưng về cơ
bản vẫn là mô hình khách/chủ. Ví dụ, máy chủ web
hoạt động như một điểm tiếp nhận,
nó chuyển yêu cầu cho máy chủ ứng dụng và ở
đó mới thực sự xử lý các yêu cầu, máy chủ
ứng dụng lại tương tác với máy chủ
cơ sở dữ liệu.
Kiến trúc khách chủ nhiều bên là kết
quả trực tiếp của việc chia ứng dụng
thành các mức giao diện, xử lý và dữ liệu, các
bên khác nhau tương ứng với tổ chức logic của
ứng dụng. Trong nhiều môi trường nghiệp vụ,
xử lý phân tán tương đương với tổ chức
ứng dụng khách chủ giống như kiến trúc nhiều
bên và gọi là phân tán không tập trung. Kiến trúc phân tán dọc
đặt các thành phần logic khác nhau trên các máy khác nhau,
khái niệm này liên quan với quan điểm phân mảnh dọc
trong các cơ sở dữ liệu quan hệ phân tán, một
bảng chia thành nhiều cột và phân tán trên nhiều máy
khác nhau. Từ góc độ quản trị hệ thống,
phân tán dọc giúp cho các chức năng được tách
vật lý và logic trên nhiều máy và mỗi máy sẽ chuyên sâu
vào một nhóm chức năng cụ thể. Tuy nhiên phân tán
dọc mới chỉ là một trong các phương pháp tổ
chức các ứng dụng khách/chủ, trong kiến trúc hiện
đại còn áp dụng phân tán ngang hay còn gọi là hệ
thống ngang hàng, máy khách và máy chủ có thể chia thành các
phần tương đương nhau nhưng mỗi phần
hoạt động trên một tập dữ liệu hoàn chỉnh,
như vậy có thể thực hiện được các
chức năng dự phòng hoặc cân bằng tải.

Hình 1.14 Ánh
xạ mục dữ liệu vào các nút trong Chord
Xét quan điểm mức cao, các tiến
trình hình thành hệ thống ngang hàng đều như nhau,
nghĩa là các chức năng cần thiết đều hiện
diện trên mỗi tiến trình, do đó nhiều
tương tác tiến trình là đối xứng, mỗi tiến
trình tại một thời điểm có thể đóng cả
hai vai trò khách và chủ. Với phong cách đối xứng
như vậy, kiến trúc ngang hàng nảy sinh vấn đề
làm thế nào có thể tổ chức các tiến trình thành mạng
bao trùm, nghĩa là mang được hình thành từ các nút
mà ở đó các tiến trình liên kết với nhau để
thể hiện các kênh truyền thông. Nói chung, tiến trình
không thể trao đổi trực tiếp với một
tiến trình bất kỳ khác, nó phải gửi thông điệp
thông qua kênh truyền thông sẵn có. Mạng bao trùm gồm
hai loại, có cấu trúc và phi cấu trúc, mạng bao trùm có
cấu trúc sử dụng thủ tục tiền định,
các tiến trình được tổ chức thông qua bảng
băm phân tán. Trong hệ thống dựa trên bảng
băm phân tán, các mục dữ liệu và các nút được
gán khóa nhẫu nhiên từ không gian định danh dài 128 hoặc
160 bit.
Điểm mấu chốt của hệ
thống dựa trên bảng băm phân tán là cài đặt
lược đồ hiệu quả để ánh xạ
duy nhất khóa của mục dữ liệu với định
danh của nút dựa trên chỉ số khoảng cách. Khi tìm
kiếm một mục dữ liệu thì sẽ trả về
địa chỉ mạng của nút có trách nhiệm đối
với mục dữ liệu đó, điều này
được thực hiện bằng cách định tuyến
yêu cầu mục dữ liệu đến nút có trách nhiệm.
Ví dụ trong hệ thống Chord, các nút được tổ
chức logic thành vòng sao cho mục dữ liệu khóa k ánh xạ
đến nút với định danh lớn hơn hoặc
bằng k, nút đó gọi là nút kế tiếp và ký hiệu
là succ(k). Để tìm kiếm mục dữ liệu ứng
dụng chạy trên nút tùy ý sẽ gọi hàm lookup(k) để
hàm này trả về địa chỉ của nút succ(k),
như vậy ứng dụng có thể liên lạc với
nút để sao chép mục dữ liệu. Làm sao có thể
tổ chức các nút thành mạng bao trùm, việc tìm kiếm khóa không theo cách tổ chức
logic của các nút mà mỗi nút sẽ duy trì một thông tin
chỉ đường đến các nút khác, như vậy
nếu mạng gồm N nút thì có thể hoàn thành tìm kiếm
sau O(log(N)) bước. Khi một
nút muốn tham gia vào hệ thống, nó khởi tạo một
định danh ngẫu nhiên chưa có thành viên nào sử dụng
và gọi hàm succ(id) để tìm địa chỉ của
nút kế tiếp và liên hệ với nút đó. Mỗi nút
phải lưu trữ thông tin về nút liền trước
và nút kế tiếp, việc chèn thêm một nút cho biết mỗi
mục dữ liệu có khóa liên quan tới nút id sẽ
được chuyển từ succ(id).

Hình 1.15 Mạng
địa chỉ nội dung
Mạng địa chỉ nội dung (CAN)
sử dụng không gian tọa độ đa chiều,
chúng phân mảnh theo các nút tham gia hệ thống. Hình 1.15
minh họa không gian hai chiều chia thành sáu nút, mỗi nút có
một khu vực liên quan, mỗi mục dữ liệu
trong CAN được gán điểm duy nhất trong không
gian này, mỗi nút có trách nhiệm cho một số mục dữ
liệu ngoại trừ những mục thuộc vùng giáp
gianh. Khi nút P muốn tham gia vào hệ thống CAN, nó nhặt
điểm bất kỳ từ không gian tọa độ
và sau đó tìm kiếm nút Q trong khu vực điểm
rơi, việc tìm kiếm này được thực hiện
thông qua định tuyến dựa trên vị trí, sau đó
sẽ tách vùng Q thành hai phần để một phần
gán cho P. Các nút lưu vết những hàng xóm của mình,
nghĩa là các nút có trách nhiệm cho khu vực kề cạnh,
khi tách vùng thì nút P có thể dễ dàng biết được
những hàng xóm bằng cách hỏi nút Q. Giống như
trong Chord, các mục dữ liệu cho mỗi nút P giờ
đây sẽ được chuyển từ nút Q. Việc
loại bỏ một nút sẽ phức tạp hơn, việc
quản lý vùng có nút bị loại bỏ sẽ chuyển
cho một trong những nút hàng xóm, nút hàng xóm tiếp nhận
sẽ thông báo cho các hàng xóm cũ về việc chuyển
giao, như vậy có thể việc phân mảnh không còn giữ
được tính đối xứng và do đó một tiến
trình nền phải định kỳ thực hiện phân
vùng lại cho toàn bộ không gian.
Các hệ thống ngang hàng phi cấu trúc
phần lớn dựa trên các giải thuật nhẫu nhiên
để xây dựng mạng bao trùm, mỗi nút duy trì danh
sách hàng xóm theo cách ngẫu nhiên và các mục dữ liệu
cũng được đặt ngẫu nhiên trên mỗi
nút, như vậy để xác định một mục dữ
liệu cụ thể thì cần phải gửi nhiều
thông điệp truy vấn tìm kiếm. Một trong những
mục tiêu của nhiều hệ thống ngang hàng phi cấu
trúc là xây dựng mạng phủ tương tự như
đồ thị ngẫu nhiên, mỗi nút duy trì danh sách các
hàng xóm đại diện cho các nút đang hoạt động.
Có nhiều cách để xây dựng danh sách này, ví dụ các
nút có thể thường xuyên trao đổi mục dữ
liệu về hàng xóm mới, trong đó chứa thông tin về
thời gian quá hạn cho mỗi mục dữ liệu.
Để thực hiện công việc này chỉ cần xây
dựng hai luồng, luồng chủ động và luồng
bị động. Luồng chủ động là luồng
khởi tạo truyền thông với nút khác lấy từ
danh sách ngẫu nhiên, luồng bị động là luồng
tiếp nhận dữ liệu lấy từ vùng đệm
nhận. Việc rời khỏi mạng cũng được
thực hiện đơn giản mà không cần phải
thông báo cho nút khác biết, nếu một nút không liên lạc
được với nút khác trong danh sách thì có thể loại
bỏ nút đó.
Nhiều
hệ thống phân tán kết hợp hai loại kiến
trúc trên để hình thành hệ thống với kiến
trúc lai ghép, các giải pháp khách chủ được kết
hợp với kiến trúc không tập trung, hệ thống
các máy chủ biên hoặc hệ thống phân tán cộng tác
thuộc loại này. Sự hiện diện của hệ
thống các máy chủ biên là cần thiết đối cho
việc kết nối liên mạng, khi sử dụng Internet, mỗi máy khách phải kết
nối với máy chủ của nhà cung cấp dịch vụ Internet (ISP), như vậy máy chủ
của các ISP đóng vai trò là những máy chủ biên, chúng có
thể phối hợp với nhau để tối ưu
hóa việc cung cấp nội dung cho máy khách.
Các ví
dụ về hệ thống phân tán cộng tác có thể kể
đến như hệ thống chia sẻ tập tin ngang
hàng (BitTorrent) và hệ thống phân phát nội dung cộng
tác (Globule). BitTorrent cho phép người dùng có thể phân phối
dữ liệu theo kiến trúc không tập trung, với
phương châm có đi có lại, nó có thể điều
phối bằng tốc độ truyền dữ liệu.
Với những hệ thống xây dựng tương tự
Globule, yêu cầu của người dùng được
chuyển đến máy chủ, như vậy đó là kiến
trúc tập trung, nhưng nội dung thông tin sẽ được
máy chủ tìm kiếm trên các hệ thống khác, như vậy
đó là kiến phúc không tập trung.
Phần
mềm trung gian hình thành tầng mới nằm giữa các ứng
dụng và nền tảng của hệ thống phân tán, nó
cung cấp tính năng trong suốt về phân phối dữ
liệu, xử lý và điều khiển từ các ứng dụng.
Sử dụng phần mềm trung gian làm cho việc thiết
kế các hệ thống phân tán trở nên đơn giản
hơn, tuy nhiên nó có thể không phải là giải pháp tối
ưu nhất đối với các phần mềm ứng
dụng, có thể khắc phục nhược điểm
này bằng cách cung cấp các phiên bản phần mềm
trung gian và phần mềm ứng dụng có thể dễ
dàng cấu hình để tùy biến theo yêu cầu thực
tiễn.
Các hệ
thống phân tán và phần mềm trung gian cần phải
cung cấp giải pháp tổng thể đương đầu
với những vấn đề ngoài mong muốn thường
xảy ra trên mạng để chúng có thể hỗ trợ
nhiều ứng dụng nhất có thể. Nhiều ứng
dụng cũng không thực sự mong muốn tính trong suốt
hoàn toàn về phân phối, điều đó đòi hỏi
hệ thống phân tán phải hỗ trợ các giải pháp
riêng cho từng ứng dụng, do đó hệ thống phân
tán phải có khả năng thích ứng, điều chỉnh
hành vi thực hiện của chúng chứ không phải các phần
mềm cấu thành hệ thống phân tán. Nếu sự
thích ứng này cần được thực hiện tự
động thì sẽ có sự tác động lẫn nhau giữa
kiến trúc hệ thống và kiến trúc phần mềm. Một
mặt, cần tổ chức các thành phần của hệ
thống phân tán sao cho có thể thực hiện việc giám
sát và điều chỉnh, mặt khác cần quyết định
nơi thực hiện các tiến trình để xử lý
việc điều chỉnh. Ví dụ các hệ thống
điều khiển phản hồi cho phép tự động
thích ứng với các thay đổi, chúng tự quản
lý, tự cấu hình và tối ưu hóa, thậm chí có thể
tự phục hồi.
THẢO LUẬN:
1.
Giải quyết vấn đề độ trễ
mạng làm ảnh hưởng đáng kể đến hiệu
năng của hệ thống phân tán.
2.
Tìm hiểu kiến trúc khách chủ ba bên.
3.
So sánh hai loại phân bố ngang và phân bố dọc
4.
Nêu các vấn đề chính khi thực hiện yêu cầu
hỏi/đáp nếu sử dụng chuỗi các tiến
trình P0, P1,… Pi-1, Pi, Pi+1,
.. Pn, trong đó Pi chỉ trả về kết quả
cho Pi-1 sau khi nhận
được kết quả từ Pi+1.
5.
Trình bày ưu và nhược điểm của cơ
chế định tuyến trong mạng phủ có cấu
trúc.
6.
Cài đặt một máy chủ để cung cấp
dịch vụ truyền tập tin, dịch vụ web.
CHƯƠNG 2:
TRAO
ĐỔI THÔNG TIN TRONG HỆ THỐNG PHÂN TÁN
Trao đổi thông tin giữa các
tiến trình là trọng tâm của tất cả các hệ
thống phân tán, do đó cần phải nghiên cứu kỹ
lưỡng cách thức các tiến trình trao đổi thông
tin với nhau. Thực chất, hệ thống phân tán sử
dụng cơ chế truyền thông điệp do mạng máy
tính đảm nhiệm, quá trình đó phức tạp
hơn rất nhiều so với việc trao đổi
thông tin giữa các tiến trình trên một máy tính. Các hệ
thống phân tán hiện đại bao gồm hàng triệu
tiến trình trao đổi thông tin với nhau qua mạng
Internet không tin cậy, nếu không thay đổi các
phương thức truyền thông nguyên thủy thì sẽ
rất khó phát triển các ứng dụng phân tán. Về
bản chất, trao đổi thông tin giữa các tiến
trình vẫn sử dụng các giao thức truyền tin
truyền thống đã qui định trong các tầng
của mạng. Các giao thức này được ứng
dụng để xây dựng các mô hình truyền tin khác
như gọi thủ tục từ xa (RPC), gọi phương
thức từ xa (RMI), phần
mềm trung gian hướng thông điệp (MOM). Mô hình
truyền tin đầu tiên trong hệ thống phân tán là
RPC, bản chất của nó là ẩn những thủ
tục phức tạp trong việc truyền thông
điệp và đó là cách lý tưởng trong các ứng
dụng khách/chủ, sau này nó đã được cải
tiến thành gọi đối tượng phân tán (DCOM).
Một số ứng dụng phân tán sử
dụng phương thức truyền thông điệp, tính
trong suốt của phương thức này khá thấp, do
đó nên chuyển sang mô hình hàng đợi (tương
tự như thư điện tử) hoặc sử
dụng lớp phần mềm trung gian hướng thông
điệp (MOM) để bảo đảm việc phân
loại các thông điệp. Các dữ liệu đa
phương tiện như âm thanh, hình ảnh ... đòi hỏi
việc truyền tin cần phải đáp ứng yếu
tố thời gian và tính liên tục, do đó mô hình
truyền thông điệp dường như chưa đáp
ứng được yêu cầu, khi đó phải sử dụng
phương pháp truyền theo luồng. Vấn đề
cuối cùng cần nghiên cứu là việc sử dụng
phương pháp truyền thông điểm–điểm hay truyền
thông theo nhóm. Truyền thông điểm-điểm sẽ
chỉ có sự hiện diện của hai thành phần: bên
gửi và bên nhận, truyền thông theo nhóm sẽ có
nhiều thành phần cùng tham gia, như vậy vấn
đề sẽ phức tạp hơn rất nhiều,
không những nảy sinh các vấn đề về
hiệu năng mà còn xuất hiện nhiều vấn
đề khác cần phải giải quyết.
Trước khi đi vào
chi tiết truyền thông trong các hệ thống phân tán chúng
ta sẽ nhắc lại một số kiến thức
cơ bản về các giao thức mạng và sau đó
sẽ đề cập đến một số cách
tiếp cận áp dụng chúng khi xây dựng các hệ
thống phân tán.
Các
tiến trình trong hệ thống phân tán không dùng chung bộ
nhớ, do đó việc trao đổi thông tin phải dựa
hoàn toàn bằng phương pháp truyền thông điệp.
Khi một tiến trình A muốn trao đổi thông tin
với tiến trình B, nó tạo một thông điệp
trong vùng nhớ riêng của mình và thực hiện lời
gọi hệ thống, khi đó hệ điều hành
sẽ thực hiện chức năng chuyển thông
điệp qua mạng đến hệ điều hành
của máy B và từ đó chuyển cho tiến trình B.
Về nguyên lý thì đơn giản như vậy, trong
thực tế quá trình này khá phức tạp bởi trong
hệ thống phân tán có thể có các máy tính thuộc các nhà
sản xuất khác nhau và sử dụng tiêu chuẩn mã hóa
thông tin khác nhau.
Để
khắc phục vấn đề này, tổ chức
chuẩn hóa Quốc tế ISO đã đưa ra mô hình liên
kết hệ thống mở OSI. Mặc dù các giao thức
trong mô hình OSI ít được sử dụng, tuy nhiên
đó là mô hình khá tốt để hiểu về mạng
máy tính. Mô hình OSI được phân thành 7 tầng, mỗi tầng
bao gồm các giao thức qui định khuôn dạng dữ
liệu và các thủ tục xử lý như cách
gửi/nhận đơn vị dữ liệu, cách xử
lý khi xảy ra lỗi.

Hình 2.1 Mô
hình liên kết hệ thống mở OSI
Mỗi tầng trong mô hình OSI thực
hiện một số chức năng nhất định:
-
Tầng
ứng dụng: Cung cấp giao diện phục vụ cho
người sử dụng và các ứng dụng khác
-
Tầng trình
diễn: Thực hiện mã hóa/giải mã, nén/giải nén và
bảo mật dữ liệu.
-
Tầng phiên:
Tạo ra các phiên làm việc.
-
Tầng giao
vận: Tạo liên kết giữa đầu cuối
với đầu cuối, điều khiển tốc
độ truyền dữ liệu, xử lý lỗi
truyền tin.
-
Tầng
mạng: Quản lý địa chỉ logic của các
đối tượng tham gia vào mạng, tìm
đường đi tốt nhất cho mỗi gói tin.
-
Tầng liên
kế dữ liệu: Thiết lập liên kết giữa
hai thiết bị vật lý kề cạnh nhau
-
Tầng
vật lý: Biến đổi các bit dữ liệu thành các
tín hiệu phù hợp với môi trường truyền
dẫn và thực hiện thu phát các tín hiệu đó.
Mặc dù mô hình OSI
với những tiêu chuẩn qui định rất rõ ràng,
nhưng nó chỉ để tham khảo, trong thực
tế các mạng thường được xây dựng
dựa trên mô hình TCP/IP, nó cũng là nền tảng của
mạng Internet ngày nay. Xét trên khía cạch cách thiết
lập liên kết giữa các thực thể truyền thông
người ta phân ra hai loại giao thức:
-
Giao thức
có liên kết: Cần phải thiết lập liên kết
trước khi truyền dữ liệu, sau khi truyền
xong thì phải hủy bỏ liên kết. Ưu điểm
của loại này là tính tin cậy cao nhưng kèm theo đó
lại là nhược điểm về hiệu năng.
-
Giao thức
không liên kết: Không cần phải thiết lập liên
kết trước khi truyền dữ liệu, như
vậy hiệu năng sẽ cao hơn nhưng đổi
lại độ tin cậy sẽ thấp hơn, tính tin
cậy trong trường hợp này sẽ do các giao thức
ở tầng trên đảm nhiệm,
Khi một tiến trình trên máy tính
muốn gửi dữ liệu cho tiến trình trên máy tính
khác, nó tạo một bản tin tại tầng ứng
dụng và bản tin đó lần lượt
được chuyển đến các lớp dưới
trên máy tính đó. Khi đi qua mỗi tầng, thông tin
điều khiển của giao thức tương ứng
với tầng đó sẽ được thêm vào bản
tin, quá trình đó gọi là bao đóng dữ liệu.

Hình 2.2: Bao đóng dữ liệu tại các lớp trong mô
hình OSI
Ở chiều ngược lại, bên
nhận sẽ nhận được luồng các bit
từ mạng ở tầng vật lý, nó chuyển lần
lượt qua các tầng, đến mỗi tầng
lại bóc tách các thông tin điều khiển của giao
thức tầng đó và chỉ chuyển phần dữ
liệu cho tầng trên cho đến khi tầng ứng
dụng nhận được sẽ là thông điệp
gốc của bên gửi.
Các giao thức mức thấp hàm ý
chỉ các giao thức thuộc ba tầng thấp nhất
của mô hình OSI: tầng vật lý, tầng liên kết
dữ liệu và tầng mạng. Tầng vật lý
liên quan tới việc chuyển các bít dữ liệu, qui
định các tiêu chuẩn cơ/điện và các giao
diện kết nối đến đường
truyền mạng, cách thể hiện các bit trên
đường truyền vật lý. Tầng liên kết
dữ liệu tập hợp các bit thành từng nhóm gọi
là khung dữ liệu, phát hiện và sửa lỗi khi
truyền các khung dữ liệu đó, nó đảm bảo
truyền thông tin cậy giữa hai thiết bị kết
nối trực tiếp với nhau. Trong mạng diện
rộng, việc trao đổi thông tin giữa các máy tính
phải chuyển qua nhiều thiết bị định
tuyến, nhiệm vụ chính của các thiết bị này
là duy trì bảng định tuyến và tìm đường
đi tốt nhất cho mỗi gói tin, giao thức đang
được sử dụng phổ biến nhất
tại tầng mạng là giao thức IP, đây là giao
thức thuộc loại không liên kết.
Như vậy các giao thức mức
thấp chỉ đảm bảo vận chuyển dữ
liệu một cách tốt nhất có thể được,
nó không đảm bảo tính tin cậy, mặc dù tầng
liên kết dữ liệu có chức năng đảm
bảo truyền thông tin cậy giữa hai thiết bị
kề cạnh nhau, nhưng không có gì đảm bảo
dữ liệu được truyền tin cậy giữa
hai thiết bị đầu cuối. Các gói tin hoàn toàn có
thể bị thất lạc hoặc bị các thiết
bị định tuyến hủy bỏ nếu nó không
thể gửi đến thiết bị kế tiếp,
độ tin cậy truyền thông giữa các ứng
dụng sẽ do các giao thức tầng vận tải
đảm nhiệm.
Tầng vận tải là tầng thấp
nhất trong ngăn xếp các giao thức cơ sở
để người lập trình viên sử dụng khi phát
triển các ứng dụng mạng. Chức năng cơ
bản của tầng vận tải là quản lý việc
trao đổi thông tin giữa các tiến trình trên các
thiết bị đầu cuối của người
sử dụng.

Hình 2.3 Qui trình truyền số liệu có
liên kết
Tầng vận tải của mô hình
TCP/IP cung cấp hai loại giao thức truyền thông, giao
thức có liên kết TCP và giao thức không liên kết UDP. Đối
với truyền số liệu có liên kết, tầng vận
tải thực hiện các chức năng phát hiện, sửa
lỗi và điều khiển tốc độ kênh
truyền logic, do đó bên gửi và bên nhận cần
phải thiết lập liên kết để thống
nhất các tham số điều khiển. Các dịch
vụ của tầng vận tải được cung
cấp thông qua các cổng, số hiệu của các
cổng do tổ chức IANA qui định.
Các giao thức mức cao thuộc các
tầng phía trên tầng vận tải, theo mô hình OSI nó bao gồm
ba tầng: tầng phiên, tầng trình diễn và tầng ứng
dụng. Ngoài ra, tùy theo yêu cầu phát triển hệ
thống người ta có thể thêm một số các giao
thức khác nhằm đơn giản hóa quá trình phát
triển các sản phẩm phần mềm mạng, các giao
thức đó được gộp chung vào nhóm tầng trung
gian. Tầng phiên quản lý các phiên hội thoại giữa
các tiến trình trên thiết bị đầu cuối mạng,
tại tầng này người ta thiết kết các
điểm kiểm tra nhằm hạn chế việc
phải truyền lại toàn bộ dữ liệu khi
xảy ra sự cố mất dữ liệu trên mạng. Tầng
trình diễn thực hiện các nhiệm vụ mã
hóa/giải mã dữ liệu nhằm thống nhất cách
thể hiện các loại dữ liệu khác nhau của
người sử dụng, ví dụ dùng bảng mã ASCII
để mã hóa văn bản. Ngoài ra tầng này cũng
thực hiện các chức năng khác như nén/giải nén dữ liệu, mã
hóa/giải mã bảo mật dữ liệu. Tầng ứng
dụng bao gồm các giao thức phục vụ trực
tiếp cho các dịch vụ của người sử
dụng như: thư điện tử, truyền tập
tin, truy nhập trang thông tin điện tử….
Các giao thức tầng trung gian
thường nằm tại tầng ứng dụng, nó bao
gồm nhiều giao thức đa năng để đảm
bảo tính độc lập với các ứng dụng,
chúng thường được thể hiện
dưới dạng các dịch vụ. Tùy theo yêu cầu
sử dụng và khả năng phát triển, có thể xây
dựng hệ thống phân tán theo cac mức độ: truyền
tập tin, xử lý theo cơ chế khách/chủ thuần
tuý, xử lý theo cơ chế
ngang hàng. Phương pháp truyền tập tin là mức
đơn giản nhất trong các hệ thống phân tán,
thông tin cần trao đổi giữa các đối
tượng trong hệ thống được lưu
dưới dạng tập tin, các máy tính phải cùng sử
dụng một giao thức để
gửi và nhận tập tin.
Các giao thức tầng trung gian
đơn giản hoá sự phức tạp trong việc
truyền dữ liệu trên mạng, nhờ có các giao
thức này mà việc gọi các thủ tục từ xa
sẽ được thể hiện tương tự
như gọi các thủ tục trên máy cục bộ.
Đối chiếu với mô hình phân tầng OSI, tầng
trung gian thể hiện các tính năng của nó trong tầng
trình diễn và tầng phiên. Hiện nay có nhiều kiến
trúc khác nhau dùng để thể hiện giao thức
tầng trung gian như: Gọi thủ tục từ xa
(RPC), kiến trúc môi trường yêu cầu đối
tượng chung (CORBA), mô hình đối tượng thành
phần phân tán (DCOM), gọi phương thức từ xa
trong Java (RMI). Giải pháp RMI áp dụng riêng cho ngôn ngữ
lập trình Java, nó sử dụng nhiều đặc tính
của phương pháp gọi thủ tục từ xa RPC
và kiến trúc CORBA. Tuy nhiên khi kiến trúc CORBA
được đưa vào lõi của ngôn ngữ Java thì
kiến trúc này sẽ dần thay thế RMI. Mô hình DCOM
chỉ được ứng dụng trong các hệ thống
cài đặt hệ điều hành của Microsoft và có
hiều hạn chế trong việc thiết kế hệ
thống.
Tầng trung gian đóng vai trò quan
trọng trong việc xây dựng các hệ thống phân tán,
việc thiết lập các tiêu chuẩn cho tầng trung gian
nhằm mục đích cung cấp khả năng
tương thích và tính mềm dẻo của các ứng
dụng phân tán, nghĩa là phải chuẩn hoá giao diện
lập trình ứng dụng và các giao thức trao đổi
thông tin. Theo hai tiêu chí trên, tầng trung gian được
chia thành bốn loại sau:
-
Tầng trung
gian mở hoàn toàn: sử dụng giao diện lập trình
ứng dụng và giao thức chung để trao đổi
thông tin giữa các thành viên phân tán, các sản phẩm
loại này đảm bảo khả năng tương tác
với nhau mà không phụ thuộc nền tảng của
mỗi thành viên trong hệ thống, ví dụ DCE RPC, CORBA,
OpenDoc.
-
Tầng trung
gian với giao diện lập trình ứng dụng mở:
Cho phép các thành viên giao tiếp với nhau không phụ
thuộc nền tảng hệ thống, các thành viên chỉ
sử dụng chung các giao thức, ví dụ sản phẩm
ODBC của Microsoft.
-
Tầng trung
gian với giao thức mở: sử dụng giao thức
chung nhưng cần phải chuyển đổi giao
diện lập trình ứng dụng, ví dụ kiến trúc
cơ sở dữ liệu quan hệ phân tán DRDA của IBM.
-
Tầng trung
gian riêng: các ứng dụng phân tán chỉ giao tiếp
với nhau khi sử dụng sản phẩm của một
nhà cung cấp, ví dụ ActiveX/OLE.
Để hiểu về
các loại truyền thông mà tầng trung gian cung cấp cho
các ứng dụng, chúng ta coi nó như một dịch
vụ phụ trợ trong mô hình khách/chủ. Ví dụ
hệ thống thư điện tử, bản chất
của hệ thống này là dịch vụ truyền thông
trung gian, trên mỗi máy của người dùng cài
đặt phần mềm cho phép biên soạn, gửi và
nhận thư điện tử. Người dùng biên
soạn thư, gửi lên hệ thống phân phát thư
điện tử và chờ đợi kết quả phân
phát thư đó đến người nhận.
Tương tự như vậy, người nhận
kết nối đến hệ thống thư
điện tử, kiểm tra xem có thư của mình hay
không, nếu có thì hệ thống thư điện tử
sẽ chuyển các bức thư đó tới máy của
người dùng. Hệ thống thư điện tử
là một ví dụ điển hình về phương pháp
truyền thông bền bỉ, các thông điệp của
người dùng được lưu trữ trong hệ
thống cho đến khi chuyển thành công đến
người nhận, bên gửi và bên nhận hoạt
động hoàn toàn độc lập với nhau.
Ngược lại, phương pháp truyền thông tạm
thời chỉ lưu giữ
thông điệp trong thời gian gửi và nhận, nghĩa
là bên gửi và bên nhận phụ thuộc lẫn nhau,
nếu bên nhận không hoạt động thì các thông
điệp sẽ bị hủy bỏ.

Hình 2.4 Nguyên lý truyền thông sử
dụng tầng trung gian
Truyền thông cũng có thể
được thực hiện dưới hình thức
đồng bộ hoặc không đồng bộ. Trong
phương thức truyền thông đồng bộ, bên
gửi sẽ bị phong tỏa cho đến khi biết
chắc chắn yêu cầu của mình đã được
bên nhận xử lý. Phương pháp này đánh dấu ba
thời điểm: Thời điểm thứ nhất bên
gửi sẽ bị phong tỏa cho đến khi hệ
thống trung gian tiếp nhận xong yêu cầu, thời
điểm thứ hai hệ thống trung gian thông báo đã
chuyển yêu cầu cho bên nhận và thời điểm
thứ ban bên gửi sẽ tiếp nhận kết quả
bên nhận xử lý. Ngược lại, truyền thông
không đồng bộ cho phép bên gửi tiếp tục
thực hiện công việc của mình sau khi đã gửi
thông điệp đến hệ thống trung gian.
Trong thực tế người ta
thường kết hợp hai loại truyền thông trên
để trao đổi thông tin giữa các tiến trình,
phương pháp truyền bền bỉ và đồng
bộ thường được áp dụng trong các trường
hợp cẩn phải chuyển một lượng
lớn dữ liệu trong khi đó phương pháp truyền
thông tạm thời và đồng bộ sẽ chỉ phù hợp với
lượng dữ liệu nhỏ, phươg pháp này
thường sử dụng trong kỹ thuật gọi
thủ tục từ xa. Bên cạnh tính bền bỉ và tính
đồng bộ người ta còn phân biệt tính rời
rạc hay liên tục của truyền thông, những hệ
thống mà mỗi thông điệp được
truyền đi là những đơn vị dữ liệu
độc lập sẽ được xếp vào nhóm
rời rạc, nếu các thông điệp được
truyền lần lượt và liên tục gọi là
phương pháp truyền tin theo luồng.
Nhiều hệ
thống phân tán sử dụng phương pháp trao
đổi trực tiếp các thông điệp giữa các
tiến trình, quá trình này được
thực hiện tường minh do đó không đáp ứng
yêu cầu tính trong suốt truyền tin, các thủ tục
gọi và nhận dữ liệu hoàn toàn không quan tâm
đến quá trình trao đổi thông tin. Các khuyến
nghị về phương pháp gọi thủ tục
từ xa RPC đã được đưa ra từ năm
1975, nhưng mãi tới năm 1984
Birrell và Nelson mới đề xuất giải pháp
hoàn toàn mới để thực hiện trao đổi
thông tin bằng phương pháp này. Ý
tưởng của phương pháp vẫn dựa vào qui
trình gọi thủ tục, tuy nhiên điểm khác biệt
nằm ở chỗ thủ tục đó được
cài đặt trên một máy tính khác, người lập
trình chỉ cần chuyển các giá trị vào các tham số
của thủ tục. Về nguyên tắc, phương pháp
này khá đơn giản cho việc cài đặt, tuy nhiên
trong thực tế nảy sinh khá nhiều vấn
đề như: thực thi
mã lệnh được thực hiện trên các vùng
nhớ khác nhau hoặc nếu một trong hai máy tính bị
lỗi trong quá trình thực thi mã lệnh cũng nảy sinh
nhiều vấn đề phức tạp. Mặc dù
vậy, phương pháp gọi thủ tục từ xa
vẫn là phương pháp được áp dụng phổ
biến nhất trong các hệ thống phân tán.
Phương pháp gọi thủ tục
từ xa cho phép cài đặt các hệ thống phân tán theo
mô hình khách/chủ: Các ứng dụng khách kết nối
với máy chủ và sử dụng các dịch vụ do máy
máy chủ cung cấp. Các bước gọi thủ tục
trên máy chủ được thực hiện tương
tự như gọi thủ tục trên máy cục bộ,
máy khách chuyển các tham số đầu vào khi gọi
thủ tục và dịch vụ trên máy chủ sẽ
kiểm tra trính hợp lệ của các tham số đó,
thực hiện tính toán và trả về các giá trị theo
yêu cầu của ứng dụng máy khách. Để
hiểu về phương pháp gọi thủ tục
từ xa, trước hết chúng ta
cần phải nhắc lại qui trình thực hiện khi gọi
một thủ tục truyền thống trên một máy tính.
Giả sử có một thủ tục đọc tập
tin đơn giản như sau:
count = read(fd, buff,
nbytes);
trong đó fd là
con trỏ tập tin, buff là vùng đệm, nbytes là
số lượng byte cần đọc.

Hình 2.5 Gọi
thủ tục trên một máy tính
Khi chương
trình gọi thủ tục, nó tạo ra một ngăn
xếp dành cho thủ tục đó. Để thực thi
lời gọi thủ tục, nó truyền các tham số
của thủ tục vào ngăn xếp theo thứ tự
ngược, tham số đầu tiên sẽ
được chuyển cuối cùng. Sau khi thực
hiện xong thủ tục, giá trị trả về sẽ
được chuyển tới các thanh ghi, giải phóng
vùng nhớ và chuyển quyền điều khiển cho
chương trình gọi, chương trình gọi sẽ
loại bỏ tham số ra khỏi ngăn xếp, trả
ngăn xếp về trạng thái như trước khi
gọi thủ tục. Việc truyền tham số có
thể được thực hiện bằng phương
pháp truyền giá trị hay truyền dịa chỉ, nó có
thể sử dụng cơ chế con trỏ hay tham
chiếu.
Con trỏ
đơn giản là địa chỉ của một
đối tượng trong bộ nhớ, thông
thường các đối tượng có thể
được truy xuất trong hai cách: trực tiếp
bởi tên đại diện hoặc gián tiếp thông qua
con trỏ. Các biến con trỏ được
định nghĩa trỏ tới các đối
tượng của một kiểu cụ thể sao cho khi
con trỏ hủy thì vùng nhớ mà đối tượng
chiếm giữ được thu hồi. Các con trỏ
thường được dùng cho việc tạo ra các đối
tượng động trong thời gian thực thi
chương trình. Không giống như các đối
tượng bình thường được cấp phát
lưu trữ trên ngăn xếp trong thời gian chạy,
một đối tượng động được
cấp phát vùng nhớ từ vùng lưu trữ khác gọi
là heap. Truyền tham chiếu cung cấp một tên
tượng trưng khác gọi là bí danh cho một
đối tượng, truy xuất một đối
tượng thông qua một tham chiếu giống như là
truy xuất thông qua tên gốc của nó. Tham chiếu nâng cao
tính hữu dụng của các con trỏ và sự tiện
lợi của việc truy xuất trực tiếp các
đối tượng, chúng được sử dụng
để hỗ trợ các kiểu gọi thông qua tham
chiếu của các tham số hàm đặc biệt khi các
đối tượng lớn được truyền
tới thủ tục. Như vậy quá trình gọi một
thủ tục được thực hiện trên môi
trường đồng nhất, trao đổi thông tin
thông qua bộ nhớ, quá trình xử lý hoàn toàn dưới
quyền điều khiển của bộ vi xử lý
của máy tính đó.

Hình 2.6 Nguyên lý
gọi thủ tục từ xa
Ý tưởng
phương pháp gọi thủ tục từ xa là che
giấu quá trình thực hiện thủ tục trên máy tính
khác, điều này được thực hiện bằng
cách che giầu quá trình trao đổi thông tin giữa các máy
tính. Khi thực hiện gọi
thủ tục từ xa, một thành phần trên máy
khách gọi là Stub sẽ bao bọc các tham số vào thông
điệp và thông điệp đó phải
được chuyển đến máy chủ. Tại máy
chủ, một thành phần tương ứng với Stub
gọi là Skeleton sẽ giải mã thông điệp đã
nhận được và thực thi các mã lệnh như
phương pháp gọi thủ tục truyền thống,
kết quả thực hiện lại được chuyển
vào thông điệp để trả về cho Stub. Stub trên
máy khách sẽ giải mã thông điệp và trả về
cho chương trình gọi các giá trị hoặc các tham
số theo yêu cầu, quá trình xử lý giữa Stub và Skeleton hoàn
toàn trong suốt đối với bên gọi thủ
tục.
Để sử
dụng tính năng gọi thủ tục từ xa, một
chương trình trên máy chủ phải cung cấp các
dịch vụ mô tả trong ngôn ngữ RPC. Mỗi máy
chủ được gán tên và số chương trình,
tất cả các dịch vụ được khai báo trong
danh sách với đầy đủ các tham số thể
hiện dịch vụ. Với nguyên tắc này, ngôn ngữ
RPC cho phép thực hiện các kiểu dữ liệu
đơn giản cũng như các dữ liệu phức
tạp như: struct, enum... Qui trình thực hiện về
cơ bản sẽ chỉ cần các bước sau:
-
Máy khách
sử dụng tính năng gọi thủ tục cục
bộ trong Stub.
-
Stub trên máy
khách gửi các tham số đến máy chủ bằng cách
gửi yêu cầu gọi thủ tục từ xa.
-
Yêu cầu
của Stub được Skeleton trên máy chủ phân tích.
-
Thực
hiện thủ tục đã được phân tích trên máy
chủ.
-
Máy chủ trả
về kết quả thực hiện cho máy khách

Hình 2.7 Các
bước thực hiện trong gọi thủ tục
từ xa
Phương pháp
gọi thủ tục từ xa thể hiện quan
điểm tách biệt giữa giao diện và phần cài
đặt, xuất phát từ việc khai báo giao diện,
phần mềm trung gian tạo các mã lệnh hỗ trợ
cho việc xử lý phân tán bằng cách thể hiện các
ứng dụng dưới dạng ngữ nghĩa
truyền thống trên máy cục bộ, tuy nhiên nó phải
đảm bảo nhiều nhiệm vụ phức tạp
như: truyền dữ liệu, đồng bộ tiến
trình. Như vậy bản chất của quá trình thực
hiện gọi thủ tục từ xa được tách
ra thành mười bước
chi tiết như sau:
1.
Thủ
tục trên máy khách gọi stub như phương pháp
gọi thủ tục truyền thống.
2.
Stub tạo
thông điệp và chuyển đến hệ điều
hành của máy khách .
3.
Hệ
điều hành của máy khách gửi thông điệp
đến hệ điều hành của máy chủ.
4.
Hệ
điều hành của máy chủ chuyển thông điệp
đến Skeleton .
5.
Skeleton
giải mã thông điệp thành các tham số và gọi
thủ tục xử lý tương ứng.
6.
Máy chủ
thực hiện lời gọi thủ tục và trả về
giá trị cho Skeleton.
7.
Skeleton
đóng gói tham số giá trị trả về thành thông
điệp và chuyển đến hệ điều hành
của máy chủ.
8.
Hệ
điều hành của máy chủ chuyển thông điệp
đến hệ điều hành của máy khách.
9.
Hệ
điều hành của máy khách nhận thông điệp và
chuyển cho Stub.
10. Stub giải mã kết quả và trả
về các tham số theo yêu cầu của thủ tục
đã gọi.
Khác với
gọi thủ tục trên một máy tính, gọi thủ
tục từ xa phải di chuyển thông tin trên mạng,
thời gian vận chuyển dữ liệu lâu hơn và tính
tin cậy sẽ thấp hơn so với việc
đọc/ghi bộ nhớ, nó có thể xảy ra trên môi
trường không đồng nhất, do đó sẽ phát
sinh một số vấn đề khác trong việc
truyền tham số.
Gọi thủ
tục truyền thống có thể truyền giá trị
hoặc truyền địa chỉ vì các tiến trình
sử dụng chung bộ nhớ. Đối với
việc gọi thủ tục từ xa, các tiến trình
sở hữu bộ nhớ riêng, do đó không thể áp
dụng phương pháp truyền địa chỉ, vì vậy
việc truyền địa chỉ trong gọi thủ
tục từ xa chỉ là giả lập, do đó ưu
điểm về hiệu năng sẽ không còn
được duy trì trong phương pháp này. Mặt khác, truyền
giá trị trở nên phức tạp đối với
hệ thống phân tán không đồng nhất, các bộ vi
xử lý của Intel theo định dạng little endian,
trong khi các bộ vi xử lý của Sun theo định
dạng big endian, qui
định lưu trữ các byte dữ liệu trong hai
hệ thống này ngược nhau.

Hình 2.8 Truyền
tham số trong các hệ thống không đồng nhất

Hình 2.9 Chuyển
tham số vào thông điệp
Hình 2.8 minh
họa ví dụ thủ tục từ xa gồm 2 thám số
(5, “JILL”), các bit dữ liệu lần lượt
được chuyển từ máy tính của hãng Intel sang
máy tính của hãng Sun, khi đến máy Sun giá trị của
các tham số theo thứ tự ngược và máy Sun sẽ
hiểu số 5 là 5 x 224,
như vậy chỉ cần đảo ngược
thứ tự là sẽ nhận được kết
quả ban đầu. Tuy nhiên, kiểu số nguyên mới
cần đảo vị trí các byte nhưng dữ liệu
kiểu xâu ký tự lại không cần thiết, do đó
phải bổ sung thêm thông tin về kiểu dữ liệu
của tham số. Con trỏ là kiểu dữ liệu
đặc biệt, nó lưu trữ địa chỉ
của một biến số mà địa chỉ đó
chỉ có ý nghĩa bên trong một máy tính, như vậy
không thể áp dụng phương pháp này để
truyền tham số trong gọi thủ tục từ xa. Tuy
nhiên, giải pháp truyền tham chiếu có thể thực
hiện bằng cách tạo một biến tham chiếu
tương ứng trên Skeleton và thủ tục trên máy
chủ sẽ sử dụng địa chỉ của
biến này như phương pháp truyền tham chiếu của
một thủ tục thông thường.
Phương pháp
gọi thủ tục từ xa che giấu quá trình trao
đổi thông tin trên mạng bằng cách đưa các tham
số vào thông điệp. Như vậy, cả phía máy khách
và máy chủ đều phải tuân thủ quy tắc
về định dạng tham số, đó là giao thức
gọi thủ tục từ xa. Để đơn
giản hóa quá trình tạo Stub cho máy khách và Scheleton cho máy
chủ, một ngôn ngữ mới được sử
dụng gọi là ngôn ngữ định nghĩa giao
diện IDL. Lập trình viên chỉ việc viết các hàm và
các thủ tục theo qui định của ngôn ngữ, sau
đó dùng chương trình dịch để chuyển sang
ngôn ngữ lập trình tương ứng.
Tương tự như gọi thủ
tục thông thường, gọi thủ tục từ xa có
thể thực hiện bằng phương pháp
đồng bộ hoặc không đồng bộ. Nếu
sử dụng phương pháp gọi đồng bộ, tiến
trình trên máy khách sẽ bị phong tỏa cho đến khi
nhận được kết quả trả về,
việc chờ đợi này đồng nghĩa với
sự suy giảm hiệu năng của hệ thống.

Hình 2.10 Hai phương
pháp gọi thủ thục từ xa

Hình 2.11 Gọi thủ
tục từ xa bằng phương pháp không đồng
bộ
Phương pháp gọi
không đồng bộ cho phép tiến trình gọi trên máy
khách gửi yêu cầu đến máy chủ, sau khi máy
chủ xác nhận đã nhận được yêu cầu,
tiến trình trên máy khách có thể tiếp tục xử lý
các tác vụ khác mà không cần chờ đợi kết
quả xử lý của máy chủ, như vậy sẽ rút
ngắn thời gian phong tỏa hệ thống. Như
vậy quá trình thực thi thủ tục trên máy chủ
sẽ độc lập với tiến trình trên máy khách,
sau khi hoàn thành, tiến trình trên máy chủ sẽ gọi
tiến trình trên máy khách để trao kết quả
trả về.
Hiện nay việc xây
dựng hệ thống phân tán dựa trên quan điểm
xây dựng các đối tượng phân tán, mỗi
ứng dụng phân tán bao gồm tập các đối
tượng. Đặc điểm cơ bản của
lập trình hướng đối tượng là việc
che giấu xử lý bên trong, do đó những thay
đổi bên trong đối tượng sẽ không
ảnh hưởng đến các đối tượng
khác. Một đặc tính quan trọng của đối
tượng là tính bao đóng các thuộc tính và phương
thức xử lý, thao tác với các thuộc tính của đối
tượng đều phải được thực
hiện thông qua các hàm giao diện. Khi máy khách gọi
đối tượng từ xa, giao diện của
đối tượng đó sẽ được nạp
vào không gian địa chỉ của máy khách và đảm
nhiệm vai trò tương tự như Stub trong
phương pháp gọi thủ tục từ xa, nó
đảm nhiệm chức năng chuyển đổi
lời gọi các hàm giao diện thành dạng thông
điệp để hệ điều hành chuyển
đến máy chủ và ngược lại chuyển
đổi thông điệp từ máy chủ thành kết
quả trả về của hàm giao diện. Kế thừa
ưu điểm của kỹ thật lập trình
hướng đối tượng, để thuận
tiện cho việc xây dựng hệ thống phân tán
người ta đã nâng tầm phương pháp gọi thủ tục từ xa thành
phương pháp gọi đối tượng từ xa, ví
dụ Java RMI, Microsoft DCOM, CORBA và dịch vụ web.
Đối tượng
thực nằm ở phía máy chủ, nó có giao diện
giống như trên máy khách và đồng thời một
thành phần Skeleton có nhiệm vụ chuyển đối
thông điệp từ phía máy khách thành lời gọi thủ
tục tương ứng và sau đó chuyển kết
quả thực hiện thành thông điệp để
hệ điều hành chuyển tới máy khách. Các
đối tượng phân tán liên quan đến vấn
đề biên dịch, mà ngôn ngữ biên dịch lại phụ
thuộc vào ngôn ngữ lập trình, do đó chúng phải xây
dựng một cách tường minh, như vậy mới
có thể xây dựng các ứng dụng dựa trên các ngôn
ngữ lập trình khác nhau. Vấn đề cài đặt
bên trong các đối tượng phân tán là công việc
của các lập trình viên, điều quan trọng cần
phải đảm bảo các tính thống nhất về
mặt giao diện để các máy tính khác có thể
gọi đối tượng đó. Giải pháp cho
vấn đề này là xây dựng một thành phần thích
nghi đối tượng để thể hiện các
đối tượng
phân tán trên môi trường
mạng.
Việc gọi các
đối tượng phân tán tương tự như
gọi đối tượng trên một máy tính,
điểm khác biệt cơ bản là trước khi
gọi hàm của đối tượng phân tán cần
phải nhúng đối tượng cục bộ vào
đối tượng phân tán. Có thể thực hiện
bằng cách gọi tường minh hoặc không
tường minh. Khi gọi tường minh, cần
phải khai báo biến con trỏ trên máy tính máy khách, sau
đó gọi hàm bind để nhúng đối tượng
phân tán vào biến con trỏ cục bộ.
Distr_object* obj_ref; //
Khai báo đối tượng tham chiếu toàn hệ
thống
obj_ref = ...; //Khởi
tạo biến tham chiếu cho đối tượng phân
tán
obj_ref->do_something(
);//Nhúng không tường minh, gọi hàm
Distr_object*
obj_ref; // Khai báo đối
tượng tham chiếu toàn hệ thống
Localobject*
obj_ptr; // Khai báo biến con
trỏ cho đối tượng cục bộ
obj_ref
=...; //
Khởi tạo biến tham chiếu cho đối
tượng phân tán obj_ptr = bind(obj_ref); // Nhúng đối tượng bằng
phương pháp tường minh
obj_ptr->do_something(
);// Gọi hàm
Ví dụ trên cho
thấy hình thức gọi thủ tục từ xa không khác
nhiều so với cách gọi thủ tục truyền
thống, chỉ cần thêm
một bước là nhúng đối tượng
trước khi gọi các thủ tục. Sự khác
biệt nằm ở bên trong quá trình thực hiện, dữ
liệu được lưu chuyển trên mạng, do
đó cần hạn chế tối đa việc phải
thiết lập/hủy bỏ kênh truyền và giảm
thiểu lượng thông tin cần trao đổi
để nâng cao hiệu năng của hệ thống.
Phương pháp gọi thủ tục
từ xa hay phương pháp gọi đối tượng
từ xa có ưu điểm là che giấu quá trình trao
đổi thông tin trong hệ thống phân tán, góp phần
nâng cao tính trong suốt của hệ thống. Cơ
chế gọi thủ tục từ xa đòi hỏi
tiến trình cung cấp dịch vụ phải luôn ở
trạng thái sẵn sàng tiếp nhận yêu cầu gọi,
điều này không phải lúc nào cũng đạt
được. Nếu sử dụng phương thức
đồng bộ để gọi thủ tục từ
xa thì tiến trình trên máy khách sẽ bị phong tỏa,
hơn nữa tiến trình trên máy khách đều phải chuyển
toàn bộ các tham số sang tiến trình máy chủ, nếu
lượng dữ liệu lớn hoặc tốc
độ kênh truyền thấp thì thời gian vận chuyển quá lâu sẽ phát sinh
lỗi quá thời gian. Như vậy việc gọi
thủ tục từ xa sẽ chỉ phù hợp cho các tác
vụ với dữ liệu nhỏ và thời gian thực
hiện nhanh, thông thường phải đảm bảo
thời gian đáp ứng không quá 600 ms, do đó phải có
những dịch vụ truyền thông khác thay thế khi
cần thiết.
Mỗi máy tính trên mạng cung cấp giao
diện trao đổi thông điệp, khi cần
chuyển thông điệp đến một máy tính khác, tiến
trình bên gửi chỉ cần chuyển các thông điệp
đó đến giao diện, công việc tiếp theo
sẽ do hệ điều hành thực hiện và
đảm bảo sẽ chuyển tới giao diện thông
điệp của bên nhận. Xét về tính tin cậy, truyền
thông điệp có thể thực hiện bằng hai
phương pháp:
-
Truyền
thông nhất thời: Thông điệp chỉ
được lưu trong thời gian thực hiện
chuyển thông tin, nếu không thành công thì thông điệp
đó sẽ bị hủy bỏ.
-
Truyền thông
bền bỉ: Thông điệp được lưu
tại bộ đệm cho đến khi toàn bộ thông
điệp đã gửi thành công cho bên nhận.
Chuyển thông điệp bền bỉ
tương tự như tổ chức mạng
lưới bưu chính, bưu
phẩm được chuyển đến các bưu
cục và người đưa thư có nhiệm vụ
chuyển các bưu phẩm đó đến người
nhận, quá trình này có thể phải được chuyển
qua một hoặc nhiều bưu cục. Xét về cách
thức gửi/nhận, truyền thông điệp có
thể được thực hiện bằng hai
phương pháp:
-
Truyền thông
đồng bộ: Bên gửi sẽ tạm ngừng
tiến trình cho đến khi toàn bộ thông điệp
được chuyển thành công đến vùng
đệm của bên nhận.
-
Truyền thông
không đồng bộ: Bên gửi chỉ bị tạm
ngừng trong thời gian chuyển thông điệp
đến vùng đệm gửi.
Trong thực tế, để truyền
thông điệp có thể tổ hợp các phương pháp
trên, như vậy có bốn khả năng xảy ra:
•
Truyền thông
đồng bộ, nhất thời
•
Truyền thông
đồng bộ, bền bỉ
•
Truyền thông
không đồng bộ, nhất thời
–
Truyền
không đồng bộ, nhất thời, dựa trên vùng
đệm của bên nhận
–
Truyền
không đồng bộ, nhất thời, dựa trên vùng
đệm của bên gửi
–
Truyền
không đồng bộ, nhất thời, dựa trên
phản hồi của bên nhận
•
Truyền thông
không đồng bộ, bền bỉ
Hầu hết các hệ thống phân tán
lựa chọn phương pháp truyền thông không
đồng bộ, nhất thời và dựa trên phản
hồi của bên nhận, như vậy có thể
đảm bảo tính tin cậy nhưng không làm suy giảm
hiệu năng của hệ thống.
Nhiều ứng dụng
trên các hệ thống phân tán được xây dựng
dựa trên dịch vụ truyền thông điệp của
tầng vận tải. Theo mô
hình mạng TCP/IP, mạng máy tính được phân làm 4 tầng,
để đảm bảo tính duy nhất mỗi thông
điệp của một tiến trình sẽ
được chuyển đến cổng đã cấp
cho tiến trình, số hiệu cổng và địa
chỉ logic của máy tính gọi là socket. Để tạo
điều kiện thuận lợi cho việc phát
triển phần mềm trên hệ thống phân tán, mô hình
TCP/IP đã qui định một số hàm nguyên thủy.
Việc chuẩn hóa giao
diện tầng vận tải cho phép lập trình viên
sử dụng các hàm nguyên thủy để truyền tin
giữa các tiến trình trên các máy tính khác nhau một cách
dễ dàng hơn. Vào những năm 1970, hãng IBM đưa ra giao diện
socket trong hệ điều hành Berkeley UNIX, hãng AT&T để
xuất giao diện XTI (viết tắt của X/Open Transport
Interface). Cả sockets lẫn XTI rất giống nhau về cách
lập trình mạng nhưng khác nhau về tập hợp
nguyên thủy của chúng. Về nguyên lý, socket là một
điểm cuối truyền thông để tiến trình
bên gửi ghi dữ liệu sẽ được chuyển
qua mạng đến điểm kết cuối bên
nhận và từ đó dữ liệu sẽ
được tiến trình bên nhận đọc. Socket trừu
tượng hóa truyền thông thực tế giữa các điểm
cuối và được hệ điều hành sử
dụng cho các giao thức tầng vận tải. Các hàm
nguyên thủy bao gồm:
|
Hàm
|
Ý nghĩa
|
|
Socket
|
Tạo điểm cuối truyền thông mới
|
|
Bind
|
Gắn địa chỉ cục bộ vào socket
|
|
Listen
|
Thông báo sẵn sạng nhận thông tin
|
|
Accept
|
Tiếp nhận yêu cầu liên kết, phong tỏa
đối tượng gọi cho đến khi có yêu
cầu kết nối gửi đến
|
|
Connect
|
Thiết lập liên kết
|
|
Send
|
Gửi dữ liệu trên kênh logic đã
được thiết lập
|
|
Receive
|
Nhận dữ liệu trên kênh logic đã
được thiết lập
|
|
Close
|
Hủy bỏ liên kết
|
Máy
chủ thường thực hiện bốn nguyên thủy
đầu tiên, khi gọi hàm Socket(), đối
tượng gọi tạo ra một điểm cuối truyền
thông mới cho một giao thức tầng vận tải. Việc
tạo ra một điểm cuối truyền thông nghĩa
là hệ điều hành cục bộ dự trữ tài
nguyên để đáp ứng yêu cẩu gửi và nhận
các thông điệp cho giao thức đã xác định. Hàm
Bind() liên kết địa chỉ cục bộ với socket
mới được tạo, nó nhúng địa chỉ IP
của máy với số hiệu cổng với nhau vào socket
để hệ điều hành biết điểm
kết cuối muốn nhận thông báo trên địa
chỉ và cổng đã xác định. Hàm Listen() thuộc
loại không phong toả và chỉ sử dụng trong
truyền thông có liên kết, thông báo cho hệ điều
hành cục bộ dành bộ đệm đủ cho một số lượng kết nối tối đa sẵn sàng chấp nhận. Hàm Accept()
phong tỏa đối tượng gọi cho đến
khi có yêu cầu kết nối. Khi một yêu cầu gửi
đến, hệ điều hành cục bộ sẽ
tạo một socket mới
với các thuộc tính giống như socket ban đầu
và trả lại cho bên gọi. Cách tiếp cận này cho
phép máy chủ tách biệt tiến trình để sau đó
sẽ xử lý truyền tin qua kết nối mới, máy
chủ có thể quay lại và đợi một yêu cầu
kết nối khác trên socket ban đầu.

Hình 2.12 Sử dụng hàm nguyên thủy
trong truyền thông đồng bộ
Về phía máy khách, trước tiên
phải tạo một điểm cuối bằng cách
sử dụng hàm Socket(), không cần thiết phải nhúng
địa chỉ và số hiệu cổng vì hệ
điều hành tự động gán cổng khi thiết
lập liên kết. Hàm Connect() đòi hỏi địa
chỉ và số hiệu cổng mà yêu cầu kết
nối sẽ gửi đến, tiến trình máy khách
bị phong tỏa cho đến khi thiết lập thành
công, sau đó cả hai bên có thể bắt đầu trao
đổi thông tin bằng cách sử dụng các hàm Send() và Receive().
Sau khi gửi và nhận dữ liệu, hai bên có thể
đóng kết nối bằng cách gọi hàm Close().
Truyền thông
điệp nhất thời sử dụng các hàm nguyên
thủy có mức độ trừu tượng thấp,
nó chỉ đơn thuần cung cấp các hàm
gửi/nhận, do đó lập trình viên phải tốn
nhiều công sức trong việc phát triển phần
mềm. Hơn nữa, các socket chỉ đáp ứng yêu
cầu truyền thông trong các mạng mô hình TCP/IP, nó không phù
hợp với các giao thức độc quyền dành riêng cho
các mạng tốc độ cao, ví dụ kết nối
mạng các mạng máy chủ cụm với tốc
độ truyền tin năng cao. Các thiết bị
mạng có hiệu năng cao phải được
gắn kèm với thư viện do nhà sản xuất cung
cấp, nhiều khi các thư viện này không tương
thích với nhau, nảy sinh vấn đề về tính
khả chuyển của hệ thống.
Nhu cầu độc
lập về nền tảng đã dẫn đến
việc định nghĩa một tiêu chuẩn cho việc
truyền thông điệp, được gọi
đơn giản là giao diện chuyển thông điệp (MPI
- Message-Passing Interface). MPI được thiết kế cho
các ứng dụng song, phù hợp với nhu cầu
truyền thông nhất thời, nó sử dụng trực
tiếp mạng cơ bản. Các lỗi như sự
cố tiến trình hoặc mất đường
tuyền mạng bị coi là nghiêm trọng và MPI không yêu
cầu phục hồi tự động.
MPI giả thiết trao
đổi thông tin diễn ra trong một nhóm các tiến
trình đã biết, mỗi nhóm có một định danh và
tiến trình trong nhóm cũng có định danh, cặp định
danh của nhóm và tiến trình xác định duy nhất
nguồn hoặc đích của thông điệp, chúng
được sử dụng thay cho địa chỉ tầng
vận tải. Các nhóm và các tiến trình có thể chồng
nhau và chúng đều có thể hoạt động song song.
Hạt nhân của MPI là các hàm nguyên thủy hỗ trợ truyền
thông nhất thời, những hàm cơ bản nhất bao gồm:
|
Hàm
|
Ý nghĩa
|
|
MPI_bsend
|
Thêm
thông điệp vào vùng đệm gửi
|
|
MPI_send
|
Gửi
thông điệp và chờ cho đến khi toàn bộ thông
điệp đã được chuyển đến vùng
đệm cục bộ hoặc bên nhận khởi tạo
thao tác nhận
|
|
MPI_ssend
|
Gửi
thông điệp và chờ cho đến khi bên nhận
bắt đầu thực hiện việc nhận thông
điệp
|
|
MPI_sendrecv
|
Chuyển
thông điệp và chờ cho đến khi có xác nhận
của bên nhận
|
|
MPI_isend
|
Tham
chiếu đến thông điệp đang chở
gửi
|
|
MPI_issend
|
Tham
chiếu đến thông điệp đang chở
gửi và chờ cho đến khi bên nhận bắt
đầu
|
|
MPI_recv
|
Nhận
thông điệp, phong tỏa nếu không có thông
điệp
|
|
MPI_irecv
|
Nhận
thông điệp, không phong tỏa nếu không có thông
điệp
|
Hàm MPI_bsend hỗ trợ truyền thông
nhất thời không đồng bộ, thông điệp
của bên gửi được sao chép vào vùng đệm
cục bộ, sau khi sao chép xong thì tiến trình gửi có
thể tiếp tục công việc khác. Hệ thống MPI
cục bộ sẽ xóa thông báo khỏi bộ đệm
cục bộ của nó và xử lý việc truyền
tải ngay sau khi bên nhận gọi hàm nhận. Hàm MPI_send có
thể phong tỏa tiến trình gửi cho đến khi
thông điệp được sao chép vào hệ thống
MPI hoặc cho đến khi
bên nhận khởi tạo thao tác nhận. Hàm MPI_ssend hỗ trợ truyền thông
đồng bộ, khi đó tiến trình gửi bị phong
tỏa cho đến khi yêu cầu của nó được
chấp nhận để xử lý tiếp. Hình thức truyền
thông đồng bộ mạnh nhất được
hỗ trợ khi bên gửi gọi hàm MPI_sendrecv, nó sẽ
gửi yêu cầu đến bên nhận và bị phong
tỏa cho đến khi bên nhận trả lời, về
cơ bản hàm này tương ứng với gọi
thủ tục từ xa.
Hai hàm MPI_send và MPI_ssend đều có các
biến thể, chúng sử dụng con trỏ để tránh
sao chép thông điệp từ bộ đệm
người dùng sang bộ đệm của hệ
thống MPI cục bộ, các biến thể này
tương ứng với hình thức truyền thông không
đồng bộ. Sử dụng hàm MPI_isend, tiến trình
gửi chuyển con trỏ đến thông điệp để
MPI sẽ xử lý truyền thông, sau đó ngay lập
tức tiếp tục công việc khác. Nhằm ngăn
chặn việc ghi đè thông điệp trước khi
quá trình truyền thông hoàn tất, MPI cung cấp các hàm
kiểm tra xem đã hoàn thành hoặc thậm chí phong tỏa
nếu được yêu cầu. Đối với
MPI_send, thông điệp đã thực sự
được chuyển đến bên nhận hay mới chỉ
được sao chép vào vùng đệm của MPI vẫn chưa được
xác định. Tương tự như vậy, với
MPI_issend, bên gửi cũng chỉ chuyển một con
trỏ đến hệ thống MPI. Khi hệ thống MPI
cho biết thông điệp đã được xử lý, tiến
trình gửi biết rằng bên nhận đã chấp
nhận và hiện đang xử lý tin nhắn đó.
Hàm MPI_recv dùng để nhận thông
điệp, nó phong tỏa tiến trình gọi cho
đến khi có thông điệp. Hàm MPI_irecv phục vụ
cho truyền thông không đồng bộ, bên nhận có
thể kiểm tra xem một tin nhắn đã thực
sự đến hay chưa nhưng không phong tỏa
tiến trình gọi, nó chỉ đơn thuần thông báo
bên nhận đã sẵn sàng. Ngữ nghĩa của các hàm
MPI không phải lúc nào cũng cứng nhắc, các hàm khác nhau
đôi khi có thể được thay thế cho nhau mà không
ảnh hưởng đến tính đúng đắn
của chương trình. Lý do chính thức tại sao
rất nhiều hình thức truyền thông khác nhau
được hỗ trợ là nó cung cấp cho những
người triển khai các hệ thống MPI đủ
khả năng để tối ưu hóa hiệu năng hệ
thống. MPI đã được thiết kế cho các
ứng dụng song song hiệu suất cao, giúp dễ
hiểu hơn về tính đa dạng của nó trong các hàm
truyền thông khác nhau.
Hệ thống hàng đợi thông
điệp hỗ trợ đắc lực cho việc trao
đổi thông tin không đồng bộ, các tiến trình
không cần phải ở trạng thái hoạt động
khi truyền tin, tuy nhiên thời gian trễ có thể lên
tới vài phút. Các tiến trình trao đổi thông tin
với nhau bằng cách đưa tin nhắn vào hàng
đợi, trách nhiệm chuyển các thông điệp
tới đích sẽ thuộc về máy chủ truyền
thông. Về nguyên tắc, mỗi tiến trình có một hàng
đợi riêng để nhận thông điệp do các tiến
trình khác gửi đến, tuy nhiên cũng có thể
nhiều tiến trình cùng chia sẻ một hàng đợi.
Hệ thống chỉ đảm bảo thông điệp
của bên gửi được đưa vào hàng đợi
cho bên nhận mà không cam kết về thời gian cũng
như việc bên nhận có đọc hay không, việc
đó hoàn toàn phụ thuộc vào cách xử lý của bên
nhận. Trao đổi thông tin không ràng buộc chặt
chẽ giữa các bên, thông điệp không cần phải
xử lý ngay sau khi nhận và bên gửi cũng không bị
phong tỏa trong thời gian chuyển thông điệp, các
tiến trình hoạt động hoàn toàn độc lập
với nhau. Khi thông điệp đã được đưa
vào hàng đợi, nó sẽ vẫn ở đó cho
đến khi bị xóa, bất kể bên gửi hay bên nhận
có đang hoạt động hay không, điều này cho thấy
bốn khả năng xảy ra như trong hình 2.13.

Hình 2.13 Tổ hợp liên kết lỏng
trong mô hình hàng đợi thông điệp
Trường hợp thứ nhất,
cả bên nhận và gửi đều đang chạy trong
toàn bộ thời gian truyền thông điệp.
Trường hợp thứ hai, bên gửi đang chạy
nhưng bên gửi lại ở trạng thái thụ
động, nghĩa là không thể phân phát được
thông điệp nhưng bên gửi vẫn có thể
tiếp tục gửi. Trường hợp thứ ba, bên
nhận đang chạy nhưng bên nhận lại ở
trạng thái thụ động, nghĩa là bên nhận đọc
thông điệp trong hàng đợi nhưng không biết bên
gửi có đang hoạt động hay không. Trường
hợp thứ tư, cả bên nhận và bên gửi
đều ở trạng thái tự động, nghĩa là
thông điệp vẫn được hệ thống
lưu trữ lại hoặc đang chuyển đi ngay
cả khi bên gửi và bên nhận không còn hoạt
động nữa. Về nguyên tắc, thông điệp có
thể chứa bất kỳ loại dữ liệu nào,
điều quan trọng là phần mềm trung gian phải đảm
bảo phân phát thông điệp chính xác, điều này
được thực hiện bằng hệ thống
định danh duy nhất trong hàng đợi. Trong một
số trường hợp kích thước của thông
điệp có thể bị giới hạn mặc dù
hệ thống hàng đợi thông điệp có thể
chia nhỏ thông điệp khi gửi và tập hợp chúng
lại ở bên nhận, quá trình này hoàn toàn trong suốt
đối với phần mềm ứng dụng. Như
vậy, hệ thống hàng đợi thông điệp
chỉ cần phải cung cấp bốn hàm cơ bản
cho phần mềm ứng dụng như sau:
|
Tên hàm
|
Ý nghĩa
|
|
Put
|
Thêm thông điệp vào hàng đợi
đã xác định
|
|
Get
|
Phong tỏa cho đến khi hàng
đợi không rỗng và xóa thông điệp đầu
tiên
|
|
Poll
|
Kiểm tra thông điệp có trong hàng
đợi hay không và xóa thông điệp đầu tiên,
không phong tỏa tiến trình gọi
|
|
Notify
|
Cài đặt trình điều khiển
để thông báo khi thông điệp được
đặt vào hàng đợi
|
Bên gửi sử dụng hàm Put()
để chuyển thông điệp vào hệ thống, nó
sẽ được thêm vào hàng đơi, hàm này không phong
tỏa tiến trình gọi. Hàm Get() thuộc loại phong
tỏa, tiến trình được ủy quyền có
thể xóa thông điệp đang chờ lâu nhất trong
hàng đợi, tiến trình gọi sẽ chỉ bị
phong tỏa nếu hàng đợi rỗng. Hàm Poll() lấy
thông điệp từ hàng đợi, nếu không tìm
thấy thông điệp thì tiến trình gọi sẽ
tiếp tục thực hiện, nghĩa là nó không bị
phong tỏa. Cuối cùng là hàm Notify(), nhiều hệ
thống hàng đợi cho phép tiến trình cài đặt
bộ điểu khiển tương tự như hàm
gọi lại, nó sẽ tự động được
kích hoạt khi có thông điệp đưa vào hàng đợi.
Cơ chế này cũng cho phép tự động khởi
tạo một tiến trình nếu như không có thành viên nào
đang hoạt động, giải pháp này thường được
cài đặt dưới dạng tiến trình giám sát hàng
đợi ở bên nhận.
Truyền thông bằng cách gọi thủ
tục từ xa hay truyền thông điệp mới
chỉ chú trọng đến việc chuyển dữ
liệu mà chưa đề cập đến loại
dữ liệu cần chuyển, thời gian thực
hiện, tính liên tục và yêu cầu đồng bộ. Gọi một thủ tục từ xa
hoặc truyền thông điệp không phụ thuộc vào
thời điểm thực hiện, dù thời gian thực
hiện có thể nhanh hay chậm cũng không ảnh
hưởng đến tính chính xác của dữ liệu. Truyền
tin yêu cầu thời gian thực phải được
thực hiện với độ trễ thấp nhất
có thể nhưng vẫn phải đáp ứng các tiêu
chuẩn về chất lượng dịch vụ.
Ví dụ khi truyền âm thanh, tai
người có thể nhận biết được âm
thành tần số từ 30 đến 20000 Hz, theo
định luật lấy mẫu của Nyquist thì tần
số lấy mẫu phải là 44100 Hz, đó cũng là tiêu
chuẩn CD 16 bit/44100 Hz bên gửi ghi lại âm tranh và
gửi lên mạng, bên nhận tổng hợp lại
luồng bit để khôi phục âm thanh bên gửi thì
cũng phải đảm bảo tần số trên,
rất tiếc tốc độ truyền thông trên mạng
thường không ổn định do đó dẫn tới
hiện tượng méo âm. Các dịch vụ đa
phương tiện bao gồm nhiều luồng dữ
liệu khác nhau như văn bản, âm thanh, hình ảnh…,
chúng đòi hỏi tính đồng bộ giữa các
luồng dữ liệu và đồng thời sự liên
tục của thông tin cũng là thước đo của
chất lượng dịch vụ, vì vậy hệ
thống phân tán phải có giải pháp để có thể
cung cấp các dịch vụ phụ thuộc vào thời
gian.
Các phương tiện hỗ trợ
trao đổi thông tin phụ thuộc thời gian bao
gồm thiết bị lưu trữ, môi trường
truyền dẫn và các thiết bị thể hiện thông
tin. Mỗi loại thông tin có các tiêu chuẩn mã hóa riêng, văn bản có kiểu mã hóa ASCII
hoặc Unicode, hình ảnh được mã hóa theo chuẩn
JPEC hoặc GIF, âm thanh được mã hóa theo chuẩn
lấy mẫu 16 bit PCM, video được mã hóa theo tiêu
chuẩn H.265 hoặc MPEG-4. Khi thể hiện dữ
liệu, những dữ liệu không liên tục như
văn bản hoặc ảnh tĩnh thì chỉ cẩn
đảm bảo thứ tự hiển thị, nhưng
đối với thông tin liên tục, quan hệ nhịp
độ giữa các mục dữ liệu là vấn
để cơ bản để biên dịch luồng
dữ liệu thành những thông tin chính xác, nó không những
phải đảm bảo chính xác về thứ tự mà
tần suất thể hiện cũng phải cố
định.
Để trao đổi thông tin phụ
thuộc thời gian, hệ thống phân tán sử dụng
luồng dữ liệu, bản chất đó là chuỗi
các đơn vị dữ liệu rời rạc, trong khi đó
việc thể hiện loại dữ liệu này cần
phải đảm bảo tính liên tục. Thời gian là
nhân tố đóng vai trò quan trọng trong luồng dữ
liệu liên tục, phương thức truyền
đồng bộ có thể đảm bảo về
mặt thứ tự nhưng không ràng buộc về
thời gian. Phương thức truyền đồng
bộ qui định thời gian trễ tối đa cho
mỗi đơn vị dữ liệu trong luồng,
thời gian truyền thực tế có thể nhỏ hơn
rất nhiều giá trị cho phép, nhưng điều quan
trọng là nó không được phép lớn hơn
khoảng thời gian giữa các lần lấy mẫu. Hệ
thống phân tán sử dụng phương thức truyền
đẳng thời để thể hiện dữ
liệu loại âm thanh hoặc video, các đơn vị
dữ liệu phải được chuyển đúng
thời gian, nghĩa là phải đảm bảo ngưỡng
thời gian tối đa và tối thiểu từ
đầu cuối đến đầu cuối.

Luồng dữ liệu có thể là
đơn hoặc phức hợp, nếu nó chỉ gồm
một loại thông tin thì đó là luồng đơn,
nếu luồng dữ liệu được cấu thành
từ nhiều luồng con và mỗi luồng con thể
hiện một loại thông tin thì gọi là luồng
phức hợp. Ví dụ, luồng dữ liệu phim
ảnh thông thường sẽ được gồm
một luồng hình ảnh và hai luồng âm thanh, nhưng
nếu có phụ đề thì cần luồng thứ
tư là văn bản. Như vậy luồng dữ
liệu phức hợp không những phải đảm
bảo tính liên tục trong mỗi luồng con mà còn cần
phải duy trì tính đồng bộ giữa các luồng con
với nhau. Vấn đề sẽ phức tạp hơn
nếu bên gửi phát trực tiếp, nghĩa là nó không
sử dụng không gian lưu trữ, như vậy cơ
hội điều khiển luồng sẽ ít hơn.
Để đơn giản, hệ thống phân tán chỉ
xét trường hợp phát dữ liệu từ một
không gian lưu trữ như vậy có thể phác thảo
lưu đồ xử lý như hình trên. Dữ liệu
được nén để giảm dung lượng
lưu trữ cũng như khi lưu chuyển trên
mạng, phải xây dựng các thành phần để
xử lý các vấn đề về kiểm soát chất
lượng và đồng bộ.
Các yêu cầu về thời gian nói chung
được thể hiện bằng những yêu cầu
chất lượng dịch vụ, nó mô tả những
điều cần thiết trong nền tảng của
hệ thống phân tán để bảo toàn quan hệ
giữa các mục dữ liệu luồng. Từ quan
điểm của một ứng dụng, cần phải
xác định một số tiêu chuẩn quan trọng sau:
•
Tốc
độ chuyển dữ liệu: Lượng dữ
liệu thực tế được chuyển đi trong
một đơn vị thời gian, nó không những bị
hạn chế bởi băng thông mà còn bị ảnh
hưởng nhiều yếu tố khác như số
lượng người dùng, ảnh hưởng của
môi trường…
•
Độ
trễ tối đa để thiết lập liên kết:
Thời gian kể từ khi đưa ra yêu cầu cho
đến khi hoàn thành thiết lập phiên làm việc,
nghĩa là một ứng dụng có thể bắt
đầu gửi dữ liệu
•
Độ trễ
tối đa từ đầu cuối đến
đầu cuối: Thời gian vận chuyển một
đơn vị dữ liệu từ tiến trình gửi
đến tiến trình nhận.
•
Biên
độ tối đa thay đổi độ trễ:
Phương sai độ trễ lớn nhất, nó thể
hiện tính ổn định của đường
truyền mạng.
•
Độ
trễ toàn phần: Giá trị trễ lớn nhất
kể từ khi gửi đơn vị dữ liệu cho
đến khi nhận được bản tin phản
hồi.
Các tiêu chuẩn trên không phải là
bất biết, hệ thống phân tán hiện nay hầu
hết đều được xây dựng dựa trên
nền tảng của mô hình TCP/IP, mạng có thể
loại bỏ bất kỳ gói tin nào khi không thể
vận chuyển được đến thiết bị
kế tiếp. Bản thân mô hình này cũng đã qui
định một loạt các tiêu chuẩn về chất
lượng dịch vụ, tuy nhiên thực tế chúng ít
khi được triển khai, do đó hệ thống phân
tán phải giải quyết những vấn đề
chất lượng dịch vụ truyền thông kém.

Cách giải quyết thứ nhất là
thiết lập giá trị ưu tiên trong gói tin IP, khi đó chúng sẽ được
các tiết bị định tuyến xử lý với
độ trễ thấp nhất và độ tin cậy
cao nhất có thể đạt được. Cách thứ
hai là sử dụng bộ đệm để loại
bỏ tính không ổn định của truyền thông,
dữ liệu nhận được sẽ đưa vào
vùng đệm, kích thước vùng đệm được
tính toán sao cho đủ khả năng đảm bảo
hiển thị thông tin liên tục. Ví dụ trong hình vẽ
minh họa, bên gửi lần lượt chuyển 8 gói tin
lên mạng, nhận được gói tin số 6, bên
nhận tính toán chỉ cần đặt kích thước
vùng đệm đủ cho 7 gói tin, khi đó nó bắt
đầu hiển thị thông tin. Thật không may khi đã
hiển thị gói tin số 7 nhưng gói tin số 8 vẫn
chưa đến, điều này sẽ làm gián đoạn
hiển thị, giải pháp duy nhất ở đây là
tăng kích thước vùng đệm.

Nếu một gói tin bị hủy
bỏ, bên nhận có thể yêu cầu gửi lại,
nhưng điều này không nằm trong cơ chế
hoạt động của giao thức IP, do đó cần
phải áp dụng kỹ thuật sửa lỗi chuyển
tiếp. Bên gửi sẽ mã hóa các gói dữ liệu
để bên nhận có thể tái tạo lại K gói tin
bị mất trên tổng số N gói tin nhận
được. Nếu một gói tin chứa nhiều khung
hình âm thanh hoặc hình ảnh, khi gói tin bị mất
sẽ để lộ một khoảng trống khá
lớn, do đó có thể sử dụng kỹ thuật
trộn bằng cách đan xen các khung như thể hiện
trên hình vẽ, các khung bị mất sẽ không liên tục,
điều đó tạo điều kiện cho thuật
toán sửa lỗi có thể phục hồi những khung
đó, tuy nhiên giải pháp này đòi hỏi phải sử
dụng bộ đệm
lớn hơn và độ trễ cũng sẽ
tăng theo.
Một vấn đề quan trọng
trong các hệ thống đa phương tiện là các
luồng phức hợp, cần phải đồng bộ
các luồng con để duy trì mối quan hệ nhịp
độ giữa các luồng. Dạng đơn giản
nhất là đồng bộ luồng dữ liệu
rời rạc với luồng dữ liệu liên tục, ví
dụ trình chiếu kèm âm thanh, phức tạp hơn là
đồng bộ dữ liệu của các luồng liên
tục, ví dụ phim ảnh sẽ phải đồng
bộ âm thanh với hình ảnh động. Việc
đồng bộ được thực hiện ở
mức độ đơn vị dữ liệu của
luồng, kích thước đơn vị dữ liệu
phụ thuộc vào mức độ trừu tượng
hóa để luồng dữ liệu thể hiện thông
tin. Ví dụ luồng dữ liệu âm thanh CD 16 bit với
tần số lấy mẫu 44100 Hz, về mặt lý thuyết
thì đồng bộ với các luồng âm thanh khác có
thể diễn ra khoảng 22.6757369615 µs một lần,
đối với các hiệu ứng âm thanh nổi chất
lượng cao thì việc đồng bộ hóa ở
cấp độ này là thực sự cần thiết. Khi
xem xét đồng bộ hóa luồng âm thanh với luồng
video theo chuẩn NTSC với tần số 29,97 Hz, khoảng
thời gian đồng bộ là 33366.7000333667 µs, một
đơn vị âm thanh có thể lên tới 1471 mẫu,
nghĩa là đơn vị dữ liệu có kích
thước khoảng 11768 byte.
Quá trình đồng bộ hóa cần xem
xét các cơ chể cơ bản để đồng
bộ hóa hai luồng và cách phân bố các cơ chế
đố trong môi trường mạng. Cơ chế
đồng bộ hóa có thể xem ở một số
mức độ trừu tượng khác nhau, ở
mức thấp nhất đồng bộ hóa
được thực hiện trên các đơn vị
dữ liệu của các luồng con. Về nguyên tắc
để đảm bảo tuân thủ ràng buộc về
nhịp độ, cứ mỗi luồng hình ảnh
lại đọc hai luồng âm thanh, điều này
được minh họa trên hình vẽ sau.

Ví dụ luồng video cấu chất
lượng thấp 320z240 điểm ảnh, mỗi
điểm ảnh được mã hóa bằng 1 byte,
như vậy đơn vị dữ liệu của
ảnh là 76800 byte, đơn vị dữ liệu luồng
âm thanh là 11768 byte, cứ sau 33366.7000333667 µs phải
đọc hai đơn vị dữ liệu luồng âm
thanh, như vậy tiến trình xử lý đầu vào
chỉ cần đạt tốc độ 2,5 Mbyte/s thì có
thể đạt được sự đồng bộ
giữa âm thanh và hình ảnh. Cách tiếp cận này cho
thấy ứng dụng hoàn toàn chịu trách nhiệm
thực hiện đồng bộ trong nhi nó chỉ có
những tiện ích cấp thấp, cách tiếp cận
tốt hơn là cung cấp cho ứng dụng một giao
diện để có thể dễ dàng kiểm soát các
luồng, ví dụ có thể cho phép điều khiển tốc
độ hiển thị hình ảnh và âm thanh. Với giao
diện điều khiển này có thể viết
chương trình gồm hai trình xử lý phục vụ cho
mỗi luồng và cùng kiểm tra tính đồng bộ
của các luồng, nếu cần thì sẽ điều
chỉnh tốc độ của các đơn vị hình
ảnh hoặc âm thanh.

Giải pháp thực hiện là cài
đặt thêm phần mềm trung gian, nó cung cấp các giao
diện để điều khiển luồng âm thanh và
hình ảnh, bao gồm các giao diện điều khiển
thiết bị vào/ra, mỗi
thiết bị có giao diện riêng, bao gồm cả giao
diện thông báo lỗi, như vậy phần mềm
ứng dụng có thể viết các thủ tục
để đồng bộ hóa các luồng dữ liệu.
Phân bố cơ chế đồng bộ lại là một
vấn đề khác cần xem xét, nhận được
luồng dữ liệu phức hợp thì phải biết
các đặc tả đồng bộ, thực tế thông
tin này được gắn ngầm định khi ghép các
luồng con vào đơn vị dữ liệu của
luồng phức hợp. Tiêu chuẩn MPEG qui định
cách nén hình ảnh và âm thanh, MPEG-2 được thiết
kể để phát dữ liệu tốc độ 4
đến 6 Mbit/s, nó có thể hợp nhất các luồng
dữ liệu liên tục và
các luồng dữ liệu rời rạc để
tạo thành một luồng duy nhất, sau đó
được chuyển thành các gói tin được gán
nhãn thời gian dựa trên đồng hồ hệ thống
tần số 90 KHz. Bên nhận sẽ tách luồng, nhãn
thời gian của mỗi gói tin được sử
dụng như một cơ chế cơ bản để
đồng bộ các luồng. Vấn đề cuối
cùng cần bàn đến là quá trình đồng bộ nên
đặt ở bên gửi hay bên nhận, nếu bên
gửi xử lý thì có thể hợp nhất các luồng con
thành luồng duy nhất với loại đơn vị
dữ liệu khác. Nếu để bên nhận thực
hiện đồng bộ thì các luồng dữ liệu con
được lưu chuyển trên mạng sẽ có
độ trễ khác nhau, do đó việc đồng
bộ sẽ khó khăn hơn,
Truyền thông theo nhóm là phương pháp
truyền dữ liệu từ một thành viên đến
nhiều thành viên khác trong cùng một nhóm. Truyền thông theo
nhóm được sử dụng trong rất nhiều
lĩnh vực của ứng dụng phân tán như:
dịch vụ phát thanh, truyền hình, hội thảo…. Vấn
đề chính của giải pháp thưc hiện yêu
cầu này nằm ở cách thiết lập kênh truyền
thông để phổ biến thông tin, chúng được
thiết lập dễ dàng hơn khi có sự trợ giúp
của phương pháp truyền thông ngang hàng và đặc
biệt là việc quản lý mạng phủ có cấu trúc. Giải
pháp thứ nhất là truyền thông ngang hàng, nó
thường được triển khai tại tầng
ứng dụng, bên gửi phải biết thông tin dùng cho
việc thiết lập kênh truyền đến tất
cả các thành viên nhận. Giải pháp thứ hai dựa
trên nguyên lý lan truyền thông tin, nó thường
được sử dụng trong các hệ thống qui mô
lớn hoặc trường hợp bên gửi không biết
đầy đủ thông tin về các thành viên nhận.
Ý tưởng cơ bản là tổ
chức các nút thành mạng phủ dùng để phổ
biến thông tin cho các thành viên trong nhóm, nó được xây
dựng ở tầng ứng dụng cho nên sẽ không có
sự tham gia của các thiết bị định
tuyến vốn chỉ hoạt động ở tầng
mạng. Liên kết giữa các nút trong mạng phủ có
thể đi qua nhiều kênh truyền vật lý và do đó
việc định tuyến các thông điệp có thể
sẽ không tối ưu như cơ chế định
tuyến của tầng mạng. Vấn đề quan
trọng là thiết kế mạng phủ, cách tiếp
cận thứ nhất là tổ chức các nút theo kiến
trúc hình cây, như vậy sẽ đảm bảo giữa
hai nút bất kỳ sẽ chỉ có một
đường đi duy nhất. Cách tiếp cận
thứ hai là các nút được tổ chức thành
một mạng lưới, mỗi nút sẽ có các nút láng
giềng, như vậy tồn tại nhiều
đường đi giữa các nút, nếu một
đường nào đó bị đứt hoặc quá
tải thì có thể tìm đường đi khác mà không
cần phải tổ chức lại mạng phủ,
như vậy khả năng chịu lỗi sẽ cao
hơn.
Có thể sử dụng
giải thuật Chord để xây dựng cây cho một
nhóm các thành viên bằng cách tạo mã định danh theo
nhóm, giả sử M_Id là khóa
ngẫu nhiên 160 bit, sử dụng hàm succ(M_Id) để tìm
kiếm nút chịu trách nhiệm đối với khóa này
và đề nghị nút đó là gốc của cây và gửi
dữ liệu đến các thành viên của nhóm. Nếu
một nút muốn tham gia, nó chỉ cần thực hiện
thao tác lookup(M_Id) để gửi thông điệp tìm
kiếm đến nút gốc succ(M_Id). Trên đường
đến nút gốc, yêu cầu này có thể sẽ
phải chuyển tiếp qua một số nút, mỗi nút
chuyển tiếp sẽ được ghi nhận là cha
của nút gửi yêu cầu. Tuy nhiên, nếu một nút
đã là cha của nút gửi thì nó không cần phải
chuyển tiếp yêu cầu đến nút gốc nữa vì
nó đã được ghi nhận là cha của nút gửi.
Việc xây dựng cây không quá khó khi tổ chức các nút
thành một mạng phủ, tuy nhiên chưa đề
cập đến vấn đề hiệu năng, nó hoàn
toàn dựa trên cách định tuyến của mạng
phủ.

Giả sử mạng phủ gồm 5
thành viên ABEDC với nút A là gốc, chúng được xây
dựng trên nền tảng các thiết bị đinh
tuyến với chi phí như trên hình vẽ. Nếu nút A
muốn chuyển thông điệp cho các thành viên, đầu
tiên sẽ chuyển đến B sau đó đến E, D và
cuối cùng chuyển đến C. Dễ dàng nhận
thấy sự lãng phí trong cách định tuyến của
mạng phủ vì dữ liệu được chuyển
hai lần qua các kênh vật lý giữa Ra và Rb, Rc và Rd, chi phí
truyền dữ liệu từ B qua E và D đến C là 73,
nếu B chuyển trực tiếp qua kênh Rb và Rd đến
Rc thì chi phí chỉ còn 47.
Chất lượng của cây truyền
thông nhóm thường được đo bằng ba tham
số: Ứng suất liên kết, độ trễ
tương đối và chi phí cây. Ứng suất liên
kết là số lần một gói tin phải chuyển qua
cùng một liên kết vật lý, giá trị của nó có
thể lớn hơn 1 xuất phát từ thực tế gói
tin có thể được vận chuyển trên hai liên
kết logic khác nhau nhưng ở mức vật lý gói tin
đã bị lặp trên một đoạn liên kết
giữa các thiết bị kề cạnh nhau. Độ
trễ tương đối đo bằng tỉ số
giữa độ trễ giữa hai nút trong mạng
phủ với độ trễ trong mạng vật lý,
nếu coi chi phí trên hình vẽ là độ trễ thì
tỉ lệ này là 1.553191, như vậy mục tiêu cần
hướng đến là giảm thiểu độ
trễ tương đối trung bình giữa tất
cả các cặp nút trong mạng phủ.
Chi phí cây là thước đo chung, nó liên
quan đến việc giảm thiểu tổng chi phí liên
kết, nếu coi chi phí của một liên kết là
độ trễ giữa hai nút cuối thì việc tối
ưu hóa chi phí cây sẽ giảm xuống để tìm
một cây phủ tổi thiểu trong đó tổng
thời gian để lan truyền thông tin đến
tất cả các nút là nhỏ nhất. Để đơn
giản hóa vấn đề, một nút trong nhóm
được giao nhiệm vụ theo dõi các thành viên trong
nhóm, một nút mới muốn tham gia sẽ gửi yêu
cầu đến nút này để lấy danh sách các thành
viên, từ đó sẽ chọn ra thành viên tốt nhất
với tư cách là nút cha của nút mới trong cây. Ví
dụ xét một nhóm có một nguồn duy nhất, như
vậy nút tốt nhất hiển nhiên là nút nguồn vì
độ trễ tương đối bằng 1, kết
quả là cây phủ có dạng hình sao. Mặc dù đơn
giản nhưng dễ dàng nhận thấy nút gốc
sẽ trở nên quá tải, việc lựa chọn một
nút làm cha nên được hạn chế bởi số
lượng các nút con, tuy nhiên điều này lại
phức tạp hóa giải thuật thiết lập cây.
Một giải pháp khác nên
được đề xuất là xây dựng cây theo cách giao
thức STP thực hiện cho các thiết bị chuyển
mạch trong mạng máy tính. Ý tưởng của giải
thuật khá đơn giản, một nút P có thể
chuyển cha bằng cách hủy bỏ liên kết với
cha hiện hành và thay thế bằng liên kết đến
nút khác với điều kiện cây mẹ không
được phép là thành viên bắt nguồn từ nút P và
cha của cây mới không có quá nhiều con nhằm tránh
hiện tượng quá tải. Có nhiều tiêu chí khác nhau
để quyết định chuyển đổi nút cha,
cách đơn giản là tối ưu hóa đường
đi đến nguồn, giảm thiểu độ
trễ khi thông điệp được truyền theo
nhóm. Để thực hiện điều này thì mỗi nút
phải thường xuyên nhận được thông tin
về trạng thái của các nút khác, mỗi nút sẽ
tự đánh giá, nếu tuyến mới tốt hơn thì
chuyển đổi cha. Một tiêu chí khác là lấy
độ trễ đến nút cha làm thước đo
để so sánh, nếu tất cả các nút đều làm
như vậy thì độ trễ tổng thể của
cây trong trường hợp lý tưởng sẽ là nhỏ
nhất. Cụ thể, mỗi nút sẽ lấy tập các
nút láng giềng của cha, nghĩa là nút ông và các nút con khác
của cha sau đó tính toán độ trễ của
từng nút và chọn nút có độ trễ thấp
nhất, khi đang thực hiện tìm cha thì sẽ từ
chối các yêu cầu gửi đến để tránh
hiện tượng lặp. Vấn đề cuối cùng
cần phải giải quyết là lỗi của một
nút cha, khi đó nó sẽ tạm thời chọn nút gốc
làm cha và khởi động lại giải thuật
tối ưu hóa để gán các nút con của nút bị
lỗi vào nút cha thích hợp.
Vấn đề quan
trọng trong truyền thông theo nhóm là giảm thiểu các
nút trung gian mà thông điệp không được sử
dụng, nút không sử dụng thông điệp gọi là nút
chuyển tiếp, như vậy mạng phủ được
xây dựng như một cây đa cấp thì chỉ có nút lá
là những thành viên sử dụng thông điệp.
Để tránh sự lãng phí đó thì cần xây dựng
mạng phủ cho mỗi nhóm, nhưng một thành viên có
thể thuộc về nhiều nhóm, như vậy mỗi
nút sẽ phải duy trì danh sách các thành viên của từng
nhóm.

Giả sử mạng
phủ tương ứng với một nhóm, khi đó
việc truyền thông điệp theo nhóm sẽ trở
thành quảng bá thông điệp trong nhóm. Khi nhận được
thông điệp mỗi nút chỉ cần kiểm tra xem
đó có phải là thông điệp mới hay không, nếu
là thông điệp cũ thì bỏ qua, nếu là thông
điệp mới chuyển tiếp đến các nút láng
giềng ngoại trừ nút gửi thông điệp cho nó.
Như vậy số lượng thông điệp sẽ
tăng gấp đôi, nghĩa là hiệu quả sẽ
thấp hơn, có thể hình dung mạng phủ như
một đồ thì N nút với M cạnh, nếu tổ chức
hình cây thì trường hợp tối ưu nhất M=N-1,
trường hợp xấu nhất tất cả các nút
được nối với nhau thì M=N(N-1)/2. Giả
sử không có thông tin gì về cấu trúc mạng phủ,
như vậy có thể xây dựng đồ thị
ngẫu nhiên, ký hiệu pedge xác xuất hai nút
bất kỳ được nối với nhau, đồ
thị khi đó sẽ có M= pedge N(N-1)/2 cạnh,
mối quan hệ giữa chúng được minh họa
trên hình vẽ.
Có thể giảm số
lượng thông điệp bằng cách sử dụng
phương pháp xác xuất Banaei-Kashani và Shahab, mỗi nút
sẽ sử dụng xác xuất pflood
để chọn pfloodN nút để chuyển tiếp, trong
đó N là số lượng nút láng
giềng. Như vậy số lượng thông điệp
sẽ giảm đi nhưng lại nảy rủi ro không
phải tất cả các nút đều nhận
được thông điệp, vì vậy cần phải
thêm yếu tố số lượng nút láng giềng trong quyết
định chuyển tiếp. Schlosser đã
thiết kế một lược đồ quảng bá
hiệu quả dựa vào việc theo dõi các nút láng giềng
trên mỗi chiều, định danh mỗi nút
được thể hiện bảng chuỗi bit với
chiều dài bằng số chiều của nhóm, mỗi
cạnh trong mạng phủ được gán nhãn với
kích thước của nó thể hiện bit đã thay
đổi khi so sánh chuỗi bit định danh của hai
nút. Tập láng giềng được xác định
bằng cách thay đổi lần lượt từng bit
của định danh nút đó, ví dụ xét trường
hợp số chiều N=4 nút 0000 sẽ có tập láng
giềng là {0001, 0010, 0100, 1000}, nút 0001 có tập láng giềng
là {0000, 0011, 0101, 1001}..., cạnh giữa 0000 và 1000
được gán nhãn 4 tương ứng với việc
thay đổi bit thứ tư, cạnh giữa 0000 và 0100
được gán nhãn bằng 3 tương đương
với việc bit thứ ba bị thay đổi. Nút ban
đầu quảng bá thông điệp m đến tất
cả các nút láng giềng và đính kèm nhãn của cạch
đã gửi thông điệp, ví dụ nút 1001 có tập láng
giềng là {1000, 1011, 1101, 0001}, khi đó nó quảng bá các
thông điệp như sau:
·
(m,1) đến
1000
·
(m,2) đến
1011
·
(m,3) đến
1101
·
(m,4) đến
0001
Khi một nút nhận
được thông điệp quảng bá, nó chỉ
chuyển tiếp đến các nút láng giềng trên cạnh
được gán giá trị cao hơn, ví dụ nút 1101 có tập láng giềng là {1100, 1111, 1001, 0101}, nhãn
của thông điệp gửi đến là 3 do đó nó
sẽ chỉ chuyển tiếp thông điệp này cho
nút 0101. Sử dụng
lược đồ này cho thấy cần quảng bá 2N-1
thông điệp, dưới góc độ số
lượng thông điệp lưu chuyển trong mạng
thì đây là cách tối ưu.
Phương pháp lan
truyền ngẫu nhiên dựa trên nguyên lý lan truyền
bệnh dịch, không cần thành phần điều
phối mà chỉ cần sử dụng thông tin cục
bộ vẫn truyền thông nhanh chóng trong tập hợp
lớn các nút. Khi cập nhật xảy ra tại một
nút, giải thuật lan truyền được thực
hiện sao cho thông tin đến được tất
cả các nút khác một cách nhanh nhất có thể. Như
vậy mỗi nút có thể nhận được thông
điệp từ nhiều nút khác, để phân biệt
dữ liệu cũ với dữ liệu mới, nhãn
thời gian sẽ được đính kèm vào mỗi thông
điệp lan truyền. Thông điệp ở đây
được hiểu là các yêu cầu, tuy nhiên nó có thể
là dữ liệu để bổ sung vào kho lưu trữ
của mỗi nút, nhưng nó cũng có thể là yêu cầu
xóa một mục dữ liệu nào đó trên mỗi nút. Một
nút được gọi là đã cập nhật nếu nó
nắm giữ dữ liệu muốn phổ biến cho các
nút khác, nút chưa nhận được thông điệp
gọi là nút chưa cập nhật, một nút không sẵn
sàng hoặc không thể phát tán dữ liệu của mình
bị coi là nút không tham gia.
Mô hình lan truyền
thường dùng là mô hình chống thất thoát (anti-entropy),
giả sử nút P chọn ngẫu nhiên nút Q để trao
đổi bản tin cập nhật, có ba cách tiếp
cận:
1.
P chỉ đẩy các bản tin cập
nhật của mình lên Q
2.
P chỉ lấy các bản tin cập
nhật mới từ Q
3.
P và Q gửi các bản tin cập nhật
cho nhau
Nếu lan truyền
cập nhật xảy ra nhanh chóng thì cách tiếp cận thứ
nhất không phải là lựa chọn tốt, nhiều nút được
đánh dấu là đã cập nhật, do đó xác xuất
để tìm ra nút chưa cập nhật rất thấp,
vì vậy nút chờ cập nhật có thể phải
chờ thời gian khá lâu vì không được nút nào chọn.
Trong trường hợp này cách tiếp cận thứ hai
sẽ tốt hơn, một nút chưa cập nhật
chọn ngẫu nhiên nút khác, nếu đó là nút đã
cập nhật thì sẽ kéo dữ liệu về, xác
suất chọn được nút đã cập nhật
sẽ cao hơn. Nếu chỉ có duy nhất một nút
được cập nhật thì có thể sử dụng
cả hai cách tiếp cận, tuy nhiên cách tiếp cận
thứ ba vẫn là lựa chọn tốt nhất. Chu
kỳ mỗi nút thực hiện một lần trao
đổi cập nhật với nút khác được
chọn ngẫu nhiên gọi là vòng, số vòng để lan
truyền một cập nhật đến tất cả
các nút là O (log (N)), trong đó N là số lượng các nút trong nhóm,
điều đó cho thấy phương pháp lan truyền
khá nhanh chóng, nhưng quan trọng hơn cả là khả
năng mở rộng qui mô. Giả sử nhóm gồm
N nút, một nút bất kỳ bắt đầu lan
truyền thông điệp đến các nút khác, gọi pi
là xác suất nút P chưa nhận được thông
điệp sau vòng thứ i, như vậy có ba
trường hợp:
·
Cách tiếp cận đẩy: Sau vòng
thứ i có N(1-pi) nút đã nhận được
bản tin, ở vòng thứ
i+1 xác xuất số nút liên hệ với P là 1-1/(N-1),
như vậy xác suất P không nhận được
bản tin là pi+1 = pi(1-1/(N-1))N(1-pi).
·
Cách tiếp cận kéo: Nút P liên hệ
với nút khác nhưng nút đó cũng chưa nhận
được bản tin, do đó xác suất P không
nhận được bản tin là pi+1 = (pi)2.
·
Cách tiếp cận đẩy và kéo: P liên
hệ với nút chưa nhận được bản tin
và cũng không có nút nào liên lạc với P, xác xuất pi+1
= (pi)2pi(1-1/(N-1))N(1-pi).

Giả sử nhóm gồm
có 10000 nút, thể hiện bằng đồ thị cho
thấy kể từ vòng thứ tám xác xuất các nút
chưa nhận được bản tin giảm nhanh
đáng kể, chỉ cần đến vòng thứ 15 thì
xác suất đó xấp xỉ bằng 0, điều đó
minh chứng mô hình lan truyền ngẫu nhiên rất hiệu
quả trong các hệ thống qui mô lớn. Một biến
thể khác của giao thức lan truyền ngẫu nhiên
gọi là lan truyền tin đồn, nếu nút P gửi
thông điệp cho nút Q, nếu Q đã nhận
được thông điệp này từ các nút khác thì nó
sẽ thông báo cho nút P sẽ không tiếp tục cập
nhật cho các nút khác, gọi xác xuất đó là pstop.
Như vậy số lượng thông điệp lan
truyền sẽ giảm đi, tuy nhiên cách làm này không
đảm bảo tất cả các nút đều nhận
được thông điệp, ký hiệu s là xác suất
các nút chưa được cập nhật, u là xác
suất các nút đã nhận được thông
điệp và vẫn đang liên hệ với các nút khác
để lan truyền thông tin, r là xác suất các nút đã
được cập nhật nhưng từ bỏ lan
truyền, rõ ràng s+u+r=1. Sử
dụng lý thuyết xác suất thống kê cho thấy quan
hệ giữa s và pstop thỏa mãn phương
trình:
s=e-(1/pstop+1)(1-s)
Đồ thị
biểu diễn tương quan giữa s và pstop cho
thấy, khi pstop có giá trị xấp xỉ 0.2 thì
s=0.0025, với những giá trị lớn hơn 0.2 thì giá
trị s sẽ tăng nhanh và do đó cần các biện
pháp bổ sung để đảm bảo tất cả
các nút đều nhận được bản tin. Ưu
điểm chính của phương pháp lan truyền
ngẫu nhiên là khả năng hội tụ nhanh, số
lượng thao tác đồng bộ tương
đối nhỏ so với các phương pháp khác.
Đối với các hệ thống được
kết nối qua mạng diện rộng thì cần
phải xem xét cấu trúc liên kết mạng để có
thể đạt kết quả tốt hơn, các nút
sẽ chỉ liên hệ với vài nút khác với xác
suất tương đối cao, nên ưu tiên cập
nhật cho các nút cầu nối giữa các mạng,
giải pháp này gọi là lan truyền có định
hướng.

Vấn đề cuối cùng là lan
truyền thông điệp chứa yêu cầu xóa mục
dữ liệu nào đó, đây là công việc không hề
đơn giản, bản chất của nó nằm ở chỗ
thông điệp đã bị xóa sẽ lại
được các nút khác cập nhật lại. Khi đã
xóa một thông điệp ra khỏi kho lưu trữ, nó
nhận được thông điệp từ các nút khác,
kiểm tra trong kho dữ liệu không thấy thông
điệp đã bị xóa, nó coi đó là thông điệp
mới, do đó sẽ ghi vào kho lưu trữ và lại
tiếp tục quá trình lan truyền cho các nút khác. Một
giải pháp đơn giản là lưu lịch sử thao
tác xóa, như vậy thông điệp yêu cầu xóa sẽ
trở thành thông điệp cập nhật, khi nhận
được thông điệp cập nhật từ các
nút khác, trước hết nó phải kiểm tra nhật ký
để quyết định có cập nhật hay không.
Cùng với thời gian, kho dữ
liệu lịch sử thao tác xóa có thể rất lớn,
điều này làm ảnh hưởng tới hiệu
năng hệ thống, do đó cần phải tính toán
thời gian hội tụ của các bản tin lan
truyền, sau khoảng thời gian này có thể loại
bỏ những bản ghi lịch sử không còn giá trị
sử dụng. Để đảm bảo chắc
chắn thông điệp yêu cầu xóa được
chuyển đến tất cả các nút, hệ thống
nên chọn một số nút không bao giờ xóa dữ
liệu lịch sử xóa. Giả sử nút P đã xóa
mục dữ liệu x, sau khoảng thời gian qui
định cho phép xóa dữ liệu lịch sử nó
ngẫu nhiên nhận được thông điệp
cập nhật cho mục dữ liệu x, khi đó P sẽ
lan truyền thông điệp xóa mục dữ liệu x
đến các nút khác.
CHƯƠNG 3:
ĐẶT
TÊN TRONG HỆ THỐNG PHÂN TÁN
Tên của thực thể đóng vai trò
quan trọng trong tất cả các hệ thống máy tính,
chúng dùng để chia sẻ tài nguyên, xác định duy
nhất các thực thể, tham chiếu đến vị
trí…. Tìm kiếm là một trong những nhiệm vụ quan
trọng của các hệ thống thông tin, hiệu năng
tìm kiếm phụ thuộc rất nhiều vào cách thức
đặt tên và tổ chức dữ liệu tìm kiếm.
Trong hệ thống phân tán, hệ thống đặt tên
thường được cài đặt trên nhiều máy
tính, qui tắc đặt tên không những phải đảm
bảo tính duy nhất mà còn đáp ứng yêu cầu về
hiệu năng và qui mô, tạo điều kiện
để tìm kiếm các đối tượng một cách
tốt nhất. Hệ thống đặt tên thường
dùng hiện nay gồm ba loại: đặt tên phi cấu
trúc, đặt tên có cấu trúc và đặt tên dựa trên
thuộc tính. Với mỗi cách đặt tên cần có các
giải thuật tìm kiếm sao cho có thể xác định
chính xác các thực thể một cách chính xác và hiệu
quả nhất.
Tên là một xâu các bit hoặc các ký
tự dùng để tham chiếu đến một
thực thể, đó có thể là máy tính, ổ đĩa
hay các tập tin, số lượng tên cho mỗi thực
thể không bị hạn chế. Tên thân thiện là các tên
được đặt một cách dễ hiểu và thân
thuộc với con người, thông thường tên thân
thiện gợi nhớ cho con người một số
đặc điểm của thực thể. Không gian tên
dùng để biểu diễn tất cả các tên, xét
về mặt hình học thì đây là một đồ
thị có hướng, gồm các nút và các cung, gọi là
đồ thị tên. Đồ thị tên có cấu trúc là
đồ thị mà mỗi nút lá miêu tả một một
thực thể, mỗi nút thư mục gắn với nhiều
nút khác và được lưu trữ trong bảng thư
mục gồm tập các cặp nhãn và định danh
của thực thể. Định
danh là một loại tên đặc biệt, mỗi
thực thể chỉ được tham chiếu bởi
duy nhất một định danh và mỗi định danh
tham chiếu duy nhất đến một thực thể,
nó cần phải đáp ứng ba yêu cầu sau:
-
Định
danh chỉ tham chiếu đến duy nhất một
thực thể
-
Mỗi
thực thể chỉ có một định danh
-
Không
được tái sử dụng định danh.
Địa chỉ là điểm truy
nhập đến thực thể, các điểm truy
nhập này cũng phải được đặt tên và
tên đó chính là địa chỉ của thực thể. Để
truy nhập đến một thực thể cần
phải biết điểm truy nhập hay còn gọi là
địa chỉ của thực thể đó. Địa
chỉ là một loại tên đặc biệt:
-
Một tên có
thể gồm nhiều địa chỉ
-
Thực
thể có thể thay đổi địa chỉ trong quá
trình tồn tại
-
Một
địa chỉ có thể trỏ đến các thực
thể khác nhau trong các thời điểm khác nhau
-
Đảm
bảo có thể tham chiếu tới các tài nguyên bằng tên
Với việc sử dụng
định danh sẽ tránh được những tình
huống nhập nhằng trong việc truy nhập thực
thể. Trong hệ thống phân tán, việc truy nhập đến
một thực thể thường phải tham chiếu
đến nhiều tên.
Đặt tên phi cấu trúc còn gọi là
tên phẳng, đơn thuần chỉ gồm chuỗi các
bit ngẫu nhiên không chứa bất kỳ thông tin nào liên
quan tới thực thể. Để xác định điểm
truy nhập tới các thực thể, người ta
sử dụng bốn giải pháp: Giải pháp đơn
giản, dựa trên nguồn gốc, hàm băm phân tán và giải
pháp phân cấp.
Giải pháp đơn giản có thể
thực hiện bằng cách gửi định danh cần
tìm theo phương pháp quảng bá, gửi cho các thành viên trong
nhóm, sử dụng con trỏ chuyển tiếp.
Phương pháp truyền thông quảng bá hoặc truyền
thông theo nhóm được thực hiện bằng cách
gửi định danh cần tìm tới tất cả các thành
viên, thành viên nào có thực thể trùng khớp với
định danh cần tìm thì gửi lại một thông điệp
chứa địa chỉ của điểm truy nhập. Hai
phương pháp đầu tiên đòi hỏi tất cả
các thành viên đều phải lắng nghe và tiếp
nhận yêu cầu gửi đến, nó chỉ phù hợp
với qui mô nhỏ, do đó thường chỉ
được áp dụng trong các mạng cục bộ. Phương
pháp dùng con trỏ chuyển tiếp dựa trên nguyên tắc
một thực thể khi rời sang vị trí khác thì phải
để lại thông tin tham chiếu tới vị trí
mới. Khi cần tìm một thực thể, máy khách có
thể xác định ngay được địa
chỉ hiện tại của thực thể này bằng
cách dò tìm lưu vết qua các thành viên chuyển tiếp, tuy
nhiên nếu chuỗi các con trỏ quá dài sẽ dẫn
đến hiệu năng thấp và nguy cơ đứt
đường truyền liên kết.
Nếu các máy tính được kết
nối trong mạng cục bộ thì việc tìm kiếm
một đối tượng bằng phương pháp
quảng bá rất đơn giản, định danh
của thực thể cần tìm sẽ được
gắn vào thông điệp gửi quảng bá đến
tất cả các máy, máy nào đáp ứng yêu cầu thì
phản hồi. Nguyên lý này là cơ sở để xây
dựng giao thức ARP dùng để tìm kiếm địa
chỉ vật lý khi biết địa chỉ IP, nó tạo
khung dữ liệu với địa chỉ vật lý
đích là địa chỉ quảng bá FFFFFFFFFFFF, khung
dữ liệu sẽ được chuyển đến
tất cả các máy trong mạng, chỉ máy nào có
địa chỉ trùng khớp với địa chỉ IP
cần tìm thì mới phản hồi. Nếu qui mô mạng
lớn hơn thì giải pháp quảng bá sẽ kém hiệu
quả, nó không những lãng phí băng thông mà còn làm gián
đoạn công việc của các máy khác. Để khắc
phục nhược điểm này có thể hạn
chế một số máy nhận được yêu cầu
bằng cách sử dụng giải pháp truyền thông theo
nhóm, tiêu chuẩn Ethernet 802.3 qui định bit thấp
nhất của byte cao nhất bằng 1 thì đó là
địa chỉ vật lý truyền thông theo nhóm. Truyền
thông theo nhóm cũng có thể được sử dụng
để xác định các thực thể trong mạng
điểm-điểm, tầng mạng dành riêng
địa chỉ IP lớp D dùng để truyền theo
nhóm.
Phương pháp con trỏ chuyển
tiếp thường dùng cho các thực thể di
động, khi thực thể di chuyển, nó để
lại vị trí cũ một tham chiếu đến
vị trí mới, như vậy chỉ cần lần theo
chuỗi các con trỏ chuyển tiếp sẽ tìm thấy
thực thể. Nếu một thực thể hay di
chuyển thì chuỗi con trỏ sẽ rất lớn,
điều đó dẫn đến hậu quả tăng
chi phí tìm kiếm. Các nút trung gian sẽ phải duy trì con
trỏ chuyển tiếp, nếu con trỏ chuyển
tiếp bị lỗi trên một nút nào đó thì sẽ không
thể tìm thấy thực thể. Ví dụ xem xét
trường hợp con trỏ chuyển tiếp trong
gọi thủ tục từ xa, mỗi thủ tục
từ xa sinh ra một cặp Stub dành cho máy khách và Skeleton
dành cho máy chủ. Giả
sử đối tượng di chuyển từ máy A sang
máy B, khi tiến trình P1 trên máy khách gọi thủ
tục tìm kiếm đối tượng, nó sẽ gửi
yêu cầu đến tiến trình P3 cài đặt
trên máy A. Nếu đối tượng vẫn nằm trên
máy A thì tiến trình P3 chỉ cần gọi
cục bộ và trả về kết quả cho máy khách,
nhưng vì đối tượng đã chuyển sang máy B,
tiến trình P3 sẽ gửi yêu cầu sang tiến
trình P4 trên máy B, sau khi nhận được
kết quả từ P4, tiến trình P3 sẽ
trả về kết quả cho tiến trình P1.
Giải pháp con trỏ chuyển tiếp che giấu toàn
bộ quá trình tìm kiếm đối tượng, máy khách
chỉ biết đến máy chủ đầu tiên mà không
biết đến các máy khác trong chuỗi con trỏ
chuyển tiếp, quá trình tìm kiếm trên máy chủ hoàn toàn
trong suốt đối với máy khách, tính bảo mật
không những sẽ tốt hơn mà còn có thể tiết
kiệm địa chỉ IP công cộng bằng cách gán cho
các máy chủ địa chỉ IP riêng.

Để giảm chuỗi con trỏ
chuyển tiếp, tiến trình P3 gắn kèm
định danh của máy khách khi gọi thủ tục trên
tiến trình P4, tiến trình P4 sẽ
trả trực tiếp kết quả về cho máy khách mà không
cần phải qua tiến trình P3, định danh
ở đây thông thường là cặp địa chỉ
IP và số hiệu cổng máy khách đã gửi. Nhận
được kết quả, máy khách sẽ cập
nhật cấu hình của mình để lần sau khi
cần tìm đối tượng sẽ gọi trực
tiếp đến tiến trình P4, như vậy
hiệu năng sẽ tăng lên nhưng không còn duy trì
được tính trong suốt, không che giấu
được địa chỉ của máy B và cũng
không tiết kiệm được địa chỉ IP
công cộng.
|

|

|
Khi tất cả các máy khách đã
được cập nhật vị trí mới của
đối tượng, máy chủ A có thể loại
bỏ bản ghi con trỏ chuyển tiếp liên quan
đến đối tượng, điều này về lý
thuyết thì đơn giản nhưng thực tế
sẽ phức tạp hơn nhiều. Sự cố phát sinh
nếu một trong những máy chủ của chuỗi con
trỏ chuyển tiếp gặp lỗi, có thể giải
quyết vấn đề này bằng cách bố trí máy
chủ luôn lưu giữ thông tin tham chiếu đến
vị trí hiện hành của đối tượng, nó
được cài đặt theo cơ chế dự phòng,
chỉ khi nào xảy ra lỗi trong chuỗi con trỏ
chuyển tiếp thì mới tham chiếu đến máy
chủ này.
Cách tiếp cận dựa trên nguồn
gốc hỗ trợ các thực thể di động trong
các hệ thống qui mô lớn, vị trí của thực
thể được đăng kí với một máy
chủ gọi là nguồn gốc, thực thể luôn
phải cập nhật vị trí hiện hành khi di
chuyển. Cách tiếp cận
này được sử dụng như một cơ
chế dự phòng khi một mắt xích trong chuyển
tiếp con trỏ gặp lỗi. Ví dụ vê mạng IP di
động, mỗi thực thể di động
được máy chủ gốc cấp phát một
địa chỉ IP cố định, mọi liên lạc
với địa chỉ IP này trước tiên sẽ
được chuyển đến tiến trình
đại diện mạng gốc. Nếu thiết bị di
động chuyển sang mạng khác, nó yêu cầu mạng
mới cấp địa chỉ IP tạm thời để
liên lạc, giá trị này sẽ được chuyển
đến tiến trình đại diện mạng gốc
để cập nhật cơ sở dữ liệu. Khi tiến
trình nhận được gói tin dành cho thực thể di
động, nó tra cứu cơ sở dữ liệu
để tìm ra địa chỉ hiện hành của thực
thể di động, nếu cùng mạng thì chỉ cần
chuyển tiếp gói tin, ngược lại nó sẽ
trả về cho bên gửi một gói tin thông báo địa
chỉ hiện hành của thực thể di động và
đồng thời tạo đường hầm chuyển
tiếp gói tin nhận đến tiến trình đại
diện cho mạng mới, từ đó gói tin sẽ
được chuyển tiếp đến thực
thể di động. Thực thể di động sẽ
trả lời bằng cách chuyển gói tin đến
tiến trình đại diện của mạng mới, gói
tin sẽ được chuyển tiếp đến bên
yêu cầu, những gói tin kế tiếp sẽ
được bên gửi chuyển trực tiếp
đến tiến trình đại diện mạng mới
mà không cần phải qua tiến trình đại diện
của mạng gốc.

Cơ chế chuyển đổi trên
hoàn toàn trong suốt đối với tiến trình xử
lý tầng ứng dụng, bên gửi sẽ ghi nhớ
địa chỉ mới của thiết bị di
động để sử dụng cho việc gửi các
gói tin kế tiếp, thiết bị di động nhận
được gói tin bằng cách giải mã bản tin
nhận được từ đường hầm
như thể nó đang sử dụng địa chỉ gốc.
Phải tham chiếu đến máy chủ gốc là
nhược điểm của phương pháp này, nó không
những làm tăng độ trễ truyền thông mà còn
không thể thực hiện được khi máy chủ
gốc bị lỗi, nếu một thực thể
quyết định di chuyển tới mạng mới
vĩnh viễn thì cũng nên đăng ký lại
địa chỉ gốc.
Giải pháp cho vấn đề này là sử dụng
dịch vụ đặt tên truyền thống, máy khách
chỉ cần tra cứu vị trí của máy chủ
gốc, thông số này tương đối ổn
định cho nên nó có thể được lưu vào
bộ nhớ cache để sử dụng cho những
lần tìm kiếm kế tiếp.
Nhiều hệ thống
tìm kiếm dựa trên hàm băm phân tán đã
được phát triển, tiêu biểu là giải
thuật Chord, nó sử dụng không gian định danh m-bit
để gán định danh được lựa
chọn ngẫu nhiên cho các nút và các khóa cho mỗi thực
thể, của m có thể bằng 128 hoặc 160 tùy
thuộc vào hàm băm được sử dụng, ví dụ
giải thuật SHA1 sử dụng 160 bit. Một thực
thể có khóa k sẽ thuộc quản lý của nút liền
sau với định danh nhỏ nhất sao cho id ≥ k và
được ký hiệu là succ(k), để đơn
giản chúng ta tạm gọi định danh p là nút P.
Vấn đề chính cần giải quyết là phân
giải một cách hiệu quả khóa k thành địa
chỉ của nút liền sau, đơn giản nhất là giải
pháp tuyến tính, mỗi nút P sẽ ghi nhớ nút liền
trước và liền sau của nó, khi nhận
được yêu cầu nó chỉ cần chuyển
tiếp cho một trong hai nút này, nếu pred (p) < k ≤ p
thì nút P sẽ trả về địa chỉ qua mình cho
tiến trình khởi tạo yêu cầu phân giải.
Thay cho cách tiếp
cận tuyến tính, giải thuật Chord duy trì một
bảng định tuyến chứa s ≤ m thực
thể, nếu FTp biểu thị tuyến của
nút P thì FTp [i]=succ (p+2i-1),
nghĩa là mục thứ i trỏ đến nút đầu
tiên kế tiếp p ít nhất 2i-1, khoảng
cách giữa các nút tăng lên theo cấp số nhân.
Để tra cứu khóa k, nút P tìm kiếm trên bảng
định tuyến, giả sử bản ghi thứ j cho
biết phải chuyển tiếp đến nút Q, trong
đó q=FTp [j] ≤ k < FTp
[j+1] hoặc q = FTp [1] khi p < k < FTp [1], nếu
bảng định tuyến của mỗi nút chỉ có
một bản ghi thì giải thuật trở thành tìm
kiếm tuyến tính.

Xét qui trình phân giải
k=26 khởi nguồn từ nút 1, bảng định
tuyến trên nút này cho thấy FT1 [5] thỏa mãn
điều kiện, như vậy nó sẽ chuyển yêu
cầu đến nút 18. Tại nút 18 ta thấy FT18
[2] ≤ k < FT18 [3]
nên nó sẽ chọn nút 20, tương tự như vậy
nút 20 chọn bản gi đầu tiên nên chuyển cho nút 21,
nút 21 chuyển cho nút 28 chịu trách nhiệm cho khóa k=26, nó
trả về cho nút 1 địa chỉ cần tìm. Nếu
yêu cầu phân giải k =12 xuất phát từ nút 28, bản
ghi thứ tư cho thấy cần phải chuyển sang nút
số 4, tại đây bản ghi thứ ba thấy rằng
cần phải chuyển sang nút số 9, nó lại
chuyển tiếp cho nút số 11 và sau đó đến nút
14 chịu trách nhiệm cho k=12 nên trả về địa
chỉ cho nút 28. Có thể thấy quá trình phân giải
sẽ thực hiện trên O (log (N)) bước, với N là
số nút trong hệ thống.
Số lượng các nút
trong hệ thống có thể thay đổi, chúng có thể
rời đi hoặc tham gia một cách tự nguyện
nhưng cũng có thể do gặp lỗi nó phải
rời đi, khắc phục xong lỗi lại tiếp
tục tham gia. Trong giải thuật Chord, nếu một nút
P muốn tham gia thì chỉ cần liên hệ với một
nút bất kỳ và gửi thông điệp tìm kiếm nút
liền sau succ(p+1), nhận được kết quả
sẽ tự chèn vào vòng logic của hệ thống. Quan trọng
nhất là phải duy trì chính xác bản ghi đầu tiên,
mỗi nút bất kỳ Q thường xuyên chạy một
thủ tục để liên hệ với succ(q+1) và yêu
cầu trả về liền trước của nút đó,
nếu q=pred (succ (q + 1)) thì
không cần phải cập nhật bảng định
tuyến, ngược lại thì có thể hiểu một
nút P đã được thêm vào hệ thống, với q
< p ≤ succ(q+1) thì Q sẽ
điều chỉnh FTq [1] thành p. Sau đó nó
thực hiện kiểm tra để đảm bảo
chắc chắn P nhận Q là nút liền trước,
nếu không đúng thì phải điều chỉnh lại FTq
[1]. Quá trình tương tự sẽ được
thực hiện trên các bản ghi khác k = q +2i-1,
những yêu cầu này sẽ được thường
xuyên gửi đi bằng các phương tiện nền
của hệ thống.
Các nút trong hệ thống luôn theo dõi các nút liền
trước của chúng, nếu không liên lạc
được với nút liền trước, nó chỉ
cần đánh dấu trạng thái không xác định.
Nếu một nút Q liên hệ với nút liền sau succ(q+1),
nhưng nút liền sau lại đã đặt Q không xác
định thì nó thông báo cho succ(q+1) để ghi nhận Q
là nút liền trước. Khi một nút rời khỏi
mạng, tất các khóa được chuyển cho nút
kế tiếp, sau đó thông báo cho nút kế tiếp và và
nút liền trước. Bảng định tuyến trên
các nút khác sẽ dần dần được điều
chỉnh thông qua quá trình ổn định mạng
định kỳ. Nếu một nút đột ngột
rời khỏi mạng sẽ gây ra các hậu quả
như sau:
-
Có thể gây mất các khóa, các mục liên
quan đến khóa.
-
Một số nút sẽ không truy vấn
được một số khóa nhất định.
Chord giải quyết vấn đề này bằng cách
lưu trên mỗi nút một danh sách các nút nằm sau nó trong
vòng Chord, nếu một nút đột ngột không liên
lạc được với nút kế tiếp thì nó
sẽ sử dụng các nút liền sau trong danh sách. Tiếp
nữa các khóa và các mục liên quan tới khóa sẽ
được sao chép trên các nút có trong danh sách, do đó
một khóa và các mục liên quan đến khóa sẽ
chỉ bị mất khi có log2(N)+1 các nút trong danh sách cùng
rời khỏi mạng.
Cách tiếp cận phân
cấp dựa trên dịch vụ địa cầu,
mạng được chia thành nhiều miền, trong
đó có một miền cấp cao nhất bao trùm toàn bộ
mạng, mỗi miền lại có thể được
chia thành nhiều miền con, miền thấp nhất
gọi là lá, nó tương ứng với mạng cục
bộ hoặc tế bào trong mạng điện thoại
di động. Nói chung, thời gian chuyển thông
điệp giữa các nút trong miền nhỏ sẽ ít
hơn trong các miền lớn. Mỗi miền có một nút
thư mục liên kết theo dõi các thực thể trong
miền, điều đó dẫn đếm một cây
thư mục, nút thư mục của miền cấp cao
nhất gọi là nút thư mục gốc, nó biết
tất cả các thực thể.

Chỉ có nút lá
mới lưu trữ địa chỉ hiện tại
của thực thể, các nút thư mục lưu trữ
con trỏ đến nút cấp thấp hơn. Một
thực thể có thể có nhiều địa chỉ,
chúng được lưu trữ trên các miền là khác nhau,
do đó nút thư mục cấp trên sẽ phải lưu
trữ nhiều con trỏ, mỗi con trỏ cho một
miền lá.

Khi máy khách gửi yêu cầu
đến nút thư mục của miền lá để
lấy địa chỉ của một thực thế, nếu
nút thư mục không tìm thấy thì sẽ chuyển lên nút
cha của nó, nếu nút cha cũng không tìm thấy thì sẽ
chuyển lên nút thư mục cấp cao hơn. Ví dụ
trên hình vẽ, khi yêu cầu được gửi
đến miền D nhưng không tìm thấy thực
thể nên chuyển đến các nút cấp cao hơn, nút thư mục M lưu bản
ghi vị trí cho thực thể, như vậy chỉ
cần tìm kiếm trong miền do nút M phụ trách. Yêu
cầu tìm kiếm được chuyển đến nút con
của M, cứ như vậy cho đến khi tìm thấy
nút lá chứa địa chỉ của thực thể,
địa chỉ đó sẽ được chuyển
về cho máy khách.

Cách tiếp cận phân cấp
ưu tiên tìm kiếm cục bộ, khu vực tìm kiếm
được mở rộng mỗi khi yêu cầu phân
giải được chuyển lên cấp cao hơn,
trường hợp xấu nhất xảy ra khi yêu cầu
đó được chuyển đến nút gốc. Vì nút
gốc chứa bản ghi cho mỗi thực thể, do
đó nó chỉ cần chuyển tiếp dọc theo các nút
con để đến nút lá, ở đó sẽ tìm
thấy địa chỉ của thực thể và trả
về cho máy khách. Thao tác cập nhật cũng
được thực hiện tương tự, một
thực thể muốn chèn địa chỉ vào một nút
lá, ngay lập tức nút lá sẽ chuyển tiếp yêu
cầu lên nút cha, nếu địa chỉ của thực
thể đã tồn tại trong miền quản lý thì
sẽ dừng chuyển tiếp đến nút cấp cao
hơn. Nút cha sẽ lưu bản ghi vị trí của
thực thể và quá trình cập nhật bản ghi lại
được thực hiện theo chiều đi
xuống, mỗi nút sẽ lưu con trỏ đến nút
cấp thấp hơn, cuối cùng nút lá sẽ cập
nhật địa chỉ của thực thể đã yêu
cầu.
|

|

|
Thêm địa chỉ theo cách
trên dẫn tới việc cài đặt chuỗi con
trỏ theo kiểu từ trên xuống dưới, bắt đầu
từ nút thư mục cấp thấp nhất có chứa
bản ghi vị trí của thực thể, nếu yêu
cầu gửi lên nút cha không thực hiện
được thì thao tác cập nhật thất bại.
Cũng có thể thực hiện theo cách từ dưới
lên trên, nghĩa là nút lá tạo bản ghi địa chỉ
trước khi chuyển yêu cầu đến nút cha,
nếu chưa thể cập
nhật nút cha thì vẫn có thể tìm kiếm cục bộ
tài miền của nút lá hiện hành. Thao tác xóa cũng
tương tự như cách thêm, khi cần xóa địa
chỉ cho một thực thể tại nút lá, nếu
bản ghi không chứa các địa chỉ khác của thực
thể thì nó có thể xóa, sau đó chuyển yêu cầu
đến nút thư mục cấp cao hơn, nếu
bản ghi vị trí của thực thể tại các nút
cấp cao hơn rống thì có thể xóa bản ghi tại
nút đó, quá trình tiếp diễn cho đến nút gốc.
Cách tiếp cận phân cấp
liệu có thể đáp ứng yêu cầu về qui mô hay
không, khi mà nút gốc cũng cần phải theo dõi tất
cả các định danh, dường như đây là
một lỗ hổng trong thiết kế. Giả sử
mỗi thực thể được gán định danh trong
không gian m-bit, hệ thống gồm N máy chủ cung cấp
dịch vụ tìm kiếm, mỗi máy chủ có khả năng
chạy một hoặc nhiều dịch vụ xác
định vị trí, mỗi dịch vụ đại
diện cho một nút ở các cấp độ khác nhau
của cây. Ký hiệu Dk(A) là miền cấp k
chứa địa chỉ A, với k = 0 biểu thị miền
gốc, LSk (E, A) là dịch vụ xác định
vị trí duy nhất trong Dk(A) chịu trách nhiệm
theo dõi vị trí hiện tại của thực thể E. Tập
Dk = {Dk, 1, Dk, 2 ,. . . , Dk,
Nk} biểu thị Nk miền ở cấp k,
hiển nhiên N0 = |D0| = 1. Đối với
mỗi cấp k, các máy chủ được phân vùng thành
các tập con Nk, với mỗi máy chủ chạy
một dịch vụ xác định vị trí đại
diện chính xác một trong các miền Dk,t từ tập
Dk.

Trong ví dụ này, cây đơn
giản có bốn cấp với chín máy chủ với hai
miền cấp 1, bốn miền cấp 2 và tám miền lá,
địa chỉ của các thực thể
được lưu trữ tại các máy chủ thuộc
miền cấp 3. Giả sử địa chỉ của
thực thể E được lưu trữ tại nút lá
của máy chủ H3, như vậy dịch vụ
xác định vị trí gốc cho thực thể E cũng
chạy trên máy chủ này. Cần thiết phải lựa
chọn một cách thận trọng dịch vụ xác
định vị trí cho thực thể E nên đặt trên
máy chủ nào, có thể kết hợp nguyên tắc thao tác
cục bộ với việc
phân bổ đầy đủ các máy chủ cấp cao
hơn thì có thể đáp ứng yêu cầu về qui mô
hệ thống.
Đặt tên phi cấu
trúc phù hợp các máy tính nhưng nó hoàn toàn không thân thiện
với con người, con người cần những tên
đơn giản dễ đọc và dễ nhớ, cho dù
đó là tên của máy tính hay tên của các tập tin.
Các tên thường được
tổ chức thành không gian tên, không gian tên có cấu trúc có
thể được thể hiện bằng đồ
thị gán nhãn có hướng với hai loại nút: nút lá và
nút thư mục. Nút lá đại diện cho thực
thể được đặt tên và không có cạnh đi
ra, nó chứa thông tin đại diện cho thực thể,
ví dụ như địa chỉ để máy khách có
thể truy nhập hoặc trạng thái của thực
thể. Nút có các cạnh đi ra gọi là nút thư mục,
mỗi cạnh được gán nhãn với tên cụ
thể. Mỗi nút trong đồ thị tên được coi là một
thực thể khác trong hệ thống phân tán, đặc
biệt nó có định danh liên kết. Nút thư mục lưu
trữ bảng thư mục biểu diễn thông tin
của các cạnh đi ra từ nút đó dưới
dạng một cặp định danh và nhãn, nếu
chỉ có các cạnh đi ra mà không có cạnh đi vào
gọi là nút gốc, mỗi đồ thị có thể có
nhiều nút gốc. Đường dẫn là chuỗi các
nhãn của các cạnh liên tiếp giữa các nút, nếu nút
đầu tiên là gốc thì gọi là đường
đẫn tuyệt đối, ngược lại gọi
là đường dẫn tương đối. Tên toàn
cục là tên biểu thị cùng một thực thể trong
toàn bộ hệ thống, tên cục bộ là tên mà ý
nghĩa của nó phụ thuộc vào nơi đang
được sử dụng, chỉ những thư
mục chứa nó được biết.

Hình 3.6 Đồ thị tên đơn
gốc
Cách mô tả đồ thị trên
gần giống với hệ thống quản lý tập
tin trên một máy tính, các nhãn trong đường dẫn
được phân cách nhau bởi dấu gạch chéo,
nếu tồn tại nhiều đường dẫn
đến một nút thì nó sẽ biểu diễn bằng
các tên đường dẫn khác nhau. Tên của các tài nguyên
cũng được đặt giống như tên của
các tập tin, cách tiếp cận này tương tự
như việc cài đặt đồ thị tên cho các tài
nguyên trong hệ thống phân tán. Hầu hết không gian tên
chỉ có duy nhất một nút gốc, trong nhiều
trường hợp nó được tổ chức
chặt chẽ dưới dạng cây, khi đó mỗi nút
chỉ có một cạnh đến, ngoại trừ nút
gốc, kết quả là mỗi nút có chính xác một tên
đường dẫn liên kết tuyệt đối.
Trong thực tế cũng có thể có những không gian tên
được biểu diễn dưới dạng
đồ thị không tuần hoàn có hướng, có thể
đến một nút bằng nhiều đường khác
nhau nhưng không được phép tạo thành vòng tuần
hoàn.

Ví dụ hệ thống quản lý
tập tin của hệ điều hành Unix, nút thư
mục đại diện cho thư mục còn nút lá
đại diện cho tập tin, nút gốc là tên ổ
đĩa logic. Ổ đĩa được chia thành
nhiều khối kế tiếp nhau, chúng bao gồm khối
khởi động dùng để nạp hệ
điều hành khi sau khi bật máy tính, siêu khối
để mô tả hệ thống tập tin, các nút chỉ
mục và cuối cùng là các khối chứa dữ liệu
của tập tin. Các nút chỉ mục chứa thông tin
phục vụ cho tìm kiếm tập tin, nó cũng có thể
chứa thông tin về thuộc tính của tập tin như
chủ sở hữu, thời gian tạo, thời gian
cập nhật cuối cùng…, nó cũng lưu trữ thông
tin về các thư mục, do đó có thể thấy
số chỉ mục tương ứng với một
định danh của nút trong đồ thị tên.
Không gian tên cung cấp cơ chế
thuận tiện để lưu trữ và truy xuất
thông tin về các thực thể bằng tên, quá trình tra
cứu thông tin dựa trên đường dẫn của
tên gọi là phân giải tên.
Đầu tiên nó phái truy vấn bảng thư mục
để tìm ra dữ liệu thực được
lưu trữ ở đâu, quá trình tìm kiếm tiếp
diễn từ nút thư mục này qua nút thư mục khác,
cuối cùng sẽ trả về định danh một nút.
Như vậy việc phân giải tên chỉ có thể
diễn ra nếu biết được bắt
đầu từ nút nào trong không gian tên, nó còn gọi là
cơ chế đóng, điều làm cho cơ chế này
đôi khi khó hiểu là chúng nhất thiết phải
ngầm hiểu từng phần của tên. Ví dụ nhìn vào
chuỗi số “84986677028” chúng ta sẽ không hiểu đó
là cái gì nếu như không biết rằng đó là số
điện thoại di động, thông tin đó là
đủ để bắt đầu quá trình phân giải. Hệ thống quản lý tên trong
hệ điều hành Unix phân biệt tên cục bộ và
tên toàn cục, biến môi trường HOME được
sử dụng để tham chiếu đến thư
mục gốc của người dùng, mỗi người
dùng có bản sao riêng của biến này được
khởi tạo thành tên toàn cục tương ứng
với thư mục chính của người dùng, cơ
chế đóng gắn kết với các biến môi
trường đảm bảo việc phân giải tên chính
xác bằng cách tra cứu bảng dành riêng cho người
dùng. Thực tế Unix coi nút chỉ mục đầu tiên
của ổ đĩa là nút gốc, độ lệch
thực tế của nó được tính toán từ
dữ liệu lấy từ siêu khối. Ví dụ
để phân giải tên /home/steen/mbox cần phải truy
nhập vào bảng thư mục của núc gốc trong
đồ thị tên, bản thân nút gốc đó cũng
được tra cứu trong một đồ thị khác.
Bí danh là một tên khác của
cùng một thực thể, về cơ bản có hai cách
triển khai trong đồ thị tên. Cách thứ nhất
là cho phép nhiều đường dẫn tuyệt
đối tham chiếu đến cùng một nút, ví dụ
thực thể các đường dẫn /keys và /home/steen/keys đều
trỏ đến nút n5. Cách thứ hai là biểu diễn
một thực thể bằng nút lá nhưng nó không lưu
trữ địa chỉ hay trạng thái mà lưu trữ
đường dẫn tuyệt đối đến
thực thể. Như vậy việc phân giải tên
sẽ được thực hiện qua hai bước,
bước thứ nhất lấy đường dẫn
tuyệt đối được lưu trữ trong nút
lá, sau đó mới phân giải đường dẫn này,
cơ chế như vậy gọi là liên kết tên. Trên hình
vẽ, bước thứ nhất phân giải để
tìm nút lá n6, ở đó lưu trữ đường
dẫn /keys, có được giá trị này sẽ tiếp
tục phân giải lần thứ hai để đến
được nút n5.

Phân giải tên cũng có
thể được thực hiện trên hai không gian khác
nhau, để thực hiện nhiệm vụ này thì
cần phải có một nút thư mục được
gọi là điểm gắn kết lưu giữ
định danh từ một không gian khác, nút thư mục
bên phía không gian tên cần gắn kết được
gọi là điểm gắn. Điểm gắn kết
được coi là một nút thư mục và thông thường
nó là gốc của không gian tên
bên ngoài, như vậy quá trình phân giải sẽ bắt
đầu bằng việc truy nhập bảng thư
mục của nút này. Để gắn kết không gian tên của các máy tính khác nhau thì
cần
tối thiểu những thông tin sau:
-
Tên
của giao thức truy nhập: Dùng để giao tiếp
với máy tính của không gian tên bên ngoài.
-
Tên
của máy chủ: Dùng để xác định địa
chỉ của máy chủ quản lý không gian tên bên ngoài.
-
Tên
của điểm truy nhập: Đó là tên của nút
gắn kết của không gian tên bên ngoài, nó sẽ
được phân giải thành định danh của nút
trong không gian tên bên ngoài.
Nếu không phải là hệ thống
phân tán thì ba thông tin trên không thực sự cần thiết,
không cần phải có giao thức truy nhập cũng
như tên của máy tính và điểm gắn kết,
điểm gắn kết chỉ đơn giản là
thư mục gốc của không gian tên bên ngoài. Tên của
điểm gắn kết sẽ được máy chủ
của không gian tên bên ngoài phân giải, nhưng cũng
cần không gian tên cho giao thức truy nhập và tên của
máy chủ, có thể sử dụng đường liên
kết URL để đại diện cho cả ba thông tin
này. Giao thức hệ thống tập tin mạng (NFS) cho
phép các máy khách có thể truy nhập đến các tập
tin cài đặt trên máy chủ, ví dụ đường
liên kết nfs://ptit.edu.vn/home/student cho
biết giao thức là NFS, tên máy chủ là ptit.edu.vn và
điểm truy nhập là /home/student. Tên nfs đã
được cộng đồng thế giới
thống nhất cách phân giải, nó hiểu rằng cần
phải triển khai giao thức NFS, tên máy chủ ptit.edu.vn
sẽ được phân giải bằng dịch vụ
tên miền DNS, như vậy chỉ còn /home/student sẽ
được máy chủ của không gian tên bên ngoài phân giải.
Tổ chức tập tin trên máy khách do
người dùng định nghĩa, nó chứa thư
mục con /remote gồm các
điểm gắn kết với không gian tên bên ngoài, ví
dụ trên hình vẽ thể hiện gắn kết không gian
tên của máy chủ, thư
mục chính của PTIT sẽ sử dụng nút /ptit
để lưu trữ đường liên kết nfs://ptit.edu.vn/home/student.
Tên /remote/ptit/mbox được phân giải trên máy khách cho
đến khi gặp nút /remote/ptit, sau đó tiếp tục
bằng cách trả về đường liên kết nfs://ptit.edu.vn/home/student,
máy khách sẽ sử dụng giao thức NFS để liên
lạc với máy chủ để có thể truy nhập
vào thư mục /home/student, quá trình phân giải tên sẽ
tiếp tục trên máy chủ bằng cách đọc
tập tin mbox.

Việc gắn kết hệ thống
tập tin từ xa như đã mô tả trên cho phép máy khách
có thể thực hiện các tập tin như thể chúng
đang ở trên máy cục bộ, giả sử máy khách có
tên là TM, người dùng có thể thực hiện các câu
lệnh sau:
TM$ cd /remote/ptit
TM$ ls –l
Kết quả thực hiện hai
lệnh trên sẽ hiển thị danh sách các tập tin trong
thư mục /home/student trên máy chủ, người dùng hoàn
toàn không biết thực tế đã lấy những
dữ liệu đó từ máy chủ ngoại trừ
thời gian có thể chậm hơn đôi chút so với
việc liệt kê các tập tin trên máy cục bộ,
dường như không gian tên bắt đầu từ /home/student
đã hòa nhập vào không gian tên trên máy khách. Trong thực
tế có nhiều cách để gắn kết không gian tên,
với qui mô nhỏ chỉ cấn gán địa chỉ IP
tĩnh cho các máy chủ sau đó cung cấp điểm gắn
kết cho các máy khách. Giả sử máy chủ Vn cài
đặt hệ điều hành Unix có địa chỉ
IP là 192.168.3.102 lưu trữ các tập tin âm thanh trong
thư mục /audio, thư mục này có thể chia sẻ
như một điểm gắn kết để các máy
khác trong mạng cục bộ có thể truy nhập. Ví
dụ máy khách TM muốn gắn kết thư mục trên
tại điểm gắn kết cục bộ /home/vn/audio thì chỉ cần thực hiện
lệnh sau:
TM$ mount –t nfs 192.168.3.102:/audio /home/vn/audio
Nếu lệnh trên thực hiện thành
công thì tất cả các tập tin trong thư mục /audio
trên máy chủ sẽ được máy khách truy nhập
trong thư mục /home/vn/audio.
Không gian tên là trái tim của dịch
vụ đặt tên, dịch vụ này được cài
đặt trên máy chủ định danh, nếu ở qui
mô nhỏ thì chỉ cần một máy chủ, với qui mô
lớn thì cần cài đặt trên nhiều máy chủ.
Không gian tên cho hệ thống phân tán qui mô lớn
thường được tổ chức theo dạng phân
cấp, để tổ chức một cách hiệu
quả người ta phân biệt ba lớp: lớp toàn
cầu, lớp hành chính và lớp quản lý. Lớp toàn cầu được
hình thành bởi các nút mức cao nhất, nghĩa là chỉ
gồm nút gốc và các nút con của nó, tính ổn
định của chúng khá cao, nghĩa là bảng thư
mục của các nút này ít thay đổi, các nút như
vậy thường đại
diện cho các tổ chức.
Lớp quản trị được hình thành thừ các
nút thư mục do cùng một đơn vị quản lý,
chúng đại diện cho các nhóm thực thể thuộc
cùng một tổ chức, các nút ít khi thay đổi
nhưng tính ổn định của nó thấp hơn
lớp toàn cục. Cuối cùng là lớp quản lý bao
gồm các nút có thể thay đổi thường xuyên, đó
là các nút đại diện cho dịch vụ nào đó, khác
với hai lớp trên, người dùng đầu cuối
cũng có thể quản trị các nút thư mục
thuộc lớp này.

Trên hình vẽ là một ví dụ về
phân lớp trong không gian tên trên mạng Internet, chúng
được chia thành các vùng không trùng lặp do một máy
chủ quản lý. Xét về tính sẵn sàng và hiệu
năng thì mỗi máy chủ phân giải tên miền sẽ
phải đáp ứng các yêu cầu khác nhau, máy chủ
ở lớp toàn cầu đòi hỏi tính sẵn sàng cao,
nếu nó bị lỗi thì một lượng lớn tên
miền sẽ không thể phân giải. Vấn đề
hiệu suất có thể giải quyết bằng cách máy
khách lưu trữ địa chỉ của tên miền
trong bộ nhớ đệm, có thể kiểm tra bằng
lệnh ipconfig /displaydns và xóa bằng lệnh ipconfig /flushdns.
Như vậy chỉ lần đầu tiên truy nhập máy
khách mới phải sử dụng dịch vụ phân
giải tên, do đó các máy chủ lớp toàn cầu không
cần phải đáp ứng nhanh các yêu cầu tra cứu,
tuy nhiên phải cung cấp đủ băng thông phục
vụ cho qui mô hàng triệu yêu cầu gửi đến. Để
đáp ứng yêu cầu về tính sẵn sàng và hiệu
năng thì các máy chủ lớp toàn cầu phải
được nhân bản, do các tên miền không đòi
hỏi cập nhật ngay lập tức cho nên sẽ
vẫn duy trì được tính nhất quán cho các bản
sao.
Tính sẵn sàng của các máy chủ ở
lớp quản trị chủ yếu quan trọng
đối với máy khách trong cùng một đơn vị
với máy chủ phân giải tên, nếu bị lỗi thì
không thể tra cứu tài nguyên trong tổ chức đó. Yêu
cầu về hiệu năng cũng tương tự
như ở lớp toàn cầu, các nút nói chung ít thay
đổi, tuy nhiên nó đòi hỏi thời gian đáp
ứng chỉ vài mili giây, như vậy các máy chủ
lớp này cũng cần phải sử dụng bộ
nhớ đệm, thời gian cập nhật thông tin
cũng phải nhanh hơn ở lớp toàn cầu, do
đó phải sử dụng các máy chủ cấu hình
mạnh kết hợp với các chiến lược nhân bản
nhưng vẫn phải đảm bảo tính nhất quán.
Các yêu cầu về tính sẵn sàng của các máy chủ
ở lớp quản lý thường ít khắt khe hơn
nhưng hiệu năng lại là vấn đề rất
quan trọng, thông tin các nút thay đổi thường xuyên
đòi hỏi phải được cập nhật ngay
lập tức.
Việc cài đặt các máy chủ phân
giải tên tại lớp toàn cầu và lớp quản
trị là phức tạp nhất, khó khăn không những
phải đáp ứng các yêu cầu về tính sẵn sàng và
hiệu năng mà còn ở khía cạnh nhất quán trong nhân
bản. Vấn đề sẽ trở nên khó khăn
hơn khi bộ nhớ đệm và các bản sao
được trải rộng trên qui mô lớn,
điều này có thể gây nên sự chậm trễ
truyền thông trong quá trình tra cứu.
|
Mục
|
Toàn cầu
|
Khu vực
|
Trực tiếp
|
|
Phạm vi
địa lý
|
Toàn thế
giới
|
Tổ chức
|
Đơn vị
|
|
Số
lượng nút
|
Ít
|
Nhiều
|
Rất nhiều
|
|
Thời gian đáp
ứng
|
Giây
|
Mili giây
|
Ngay lập tức
|
|
Cập nhật lan
truyền
|
Ít
|
Ngay lập tức
|
Ngay lập tức
|
|
Số
lượng bản sao
|
Nhiều
|
Ít
|
Không có
|
|
Lưu yêu cầu
máy khách?
|
Có
|
Có
|
Không cần
|
Mỗi thực thể
đều có tên và địa chỉ tương ứng,
việc ánh xạ từ tên đến địa chỉ
của thực thể được thực hiện theo
hai phương pháp: theo mô hình một lớp và theo mô hình hai
lớp. Mô hình một
lớp chỉ
có một mức ánh xạ giữa tên và thực thể, mỗi lần thực thể thay
đổi vị trí, ánh xạ cần phải
được thay đổi theo. Mô hình hai lớp phân biệt tên
và địa chỉ nhờ định danh thực
thể, nó gồm
quá trình tìm định danh thực thể tương
ứng từ tên của thực thể được
thực hiện bằng dịch vụ tên và quá trình xác
định vị trí của thực thể từ
định danh được thực hiện bởi
dịch vụ định vị.
Không gian tên
được phân bố trên nhiều máy chủ có ảnh
hưởng đến việc phân giải tên, quá trình phân
giải tên bắt đầu từ máy khách, nó kiểm tra
xem tên miền đã có trong bộ nhớ đệm hay
chưa, nếu chưa có thì sẽ gửi yêu cầu
đến máy chủ phân giải tên đã được
qui định trong cấu hình của thiết bị. Để
biết địa chỉ của máy chủ này chỉ
cần gõ lệnh ipconfig /all, sau khi nhận được
yêu cầu của máy khách, máy chủ phân giải tên miền
mặc định có thể sử dụng một trong hai
phương pháp: phân giải tên
tương tác và phân giải tên đệ quy. Phân giải
tên tương tác thực hiện bằng cách truyền và
nhận qua lại giữa máy khách và các máy chủ quản
lý tên ở các mức khác nhau. Các máy chủ quản lý tên
không trao đổi trực tiếp với nhau, mỗi máy
chủ chỉ phân giải nhãn tương ứng với
lớp để xác định địa chỉ của
máy chủ tiếp theo, kết quả trả lại cho máy
khách là địa chỉ của máy chủ quản lý tên
kế tiếp và việc liên kết với máy chủ
tiếp theo là do máy khách đảm nhiệm. Phân giải tên
đệ quy thực hiện bằng cách mỗi máy chủ
quản lý tên sẽ gửi kết quả đến máy
chủ quản lý tên tiếp theo mà nó tìm thấy và cứ
như vậy cho đến khi hoàn thành phân giải toàn
bộ đường dẫn.
Ví dụ cần
phải truy nhập trang http://www.ptit.edu.vn/index.html, như
vậy cần phải phân giải tên miền www.ptit.edu.vn,
theo lý thuyết đã trình bày trên, đường dẫn
tuyệt đối sẽ là root:<vn, edu, ptit, www>.
Để hiểu rõ hơn về qui trình phân giải tên
miền, giả thiết máy khách không chứa bản ghi tên
miền này trong bộ nhớ đệm, do đó nó
phải đi qua tất cả các nút trong đồ thị
tên để lấy địa chỉ của tên miền
này. Nếu sử dụng phương pháp phân giải tên
miền tương tác, tiến trình máy khách sẽ gửi
thông điệp <vn, edu, ptit, www> đến máy chủ
cấp cao nhất, máy chủ sẽ trả về cho máy
khách một tham chiều đến nút <vn>, nhận
được tham chiếu này, máy khách tiếp tục truy
vấn nút máy chủ quản lý nút vn để yêu cầu
phân giải <edu, ptit, www>, máy chủ quản lý nút vn
lại trả về tham chiếu đến máy chủ
quản lý nút <edu>. Máy khách lại gửi yêu cầu phân
giải <ptit, www> đến máy chủ quản lý nút
<edu>, máy chủ này lại trả về tham chiếu
đến nút <ptit>. Máy khách tiếp tục gửi
đến máy chủ quản lý nút <ptit> yêu cầu
địa chỉ của <www>, máy chủ trả
về địa chỉ của nút <www>, như vậy
tiến trình phân giải đã hoàn thành, nó trả về cho
ứng dụng địa chỉ của tên miền www.ptit.edu.vn
để có thể truy vấn nội dung của trang index.html.
Ưu điểm của phương pháp phân giải tên
miền là tính phân tải được dải đều
cho các máy chủ, tuy nhiên nhược điểm của nó
là hiệu quả sử dụng tính năng lưu trữ
địa chỉ trong bộ nhớ đệm
tương đối thấp.

Nếu sử dụng
phương pháp phân giải tên miền đệ qui, máy
khách gửi yêu cầu phân giải <vn, edu, ptit, www>
đến máy chủ tên miền gốc, máy chủ tên
miền gốc sẽ gửi yêu cầu đến máy
chủ quản lý nút vn, yêu cầu tiếp tục
được chuyển đến máy chủ quản lý
nút edu và sau đó chuyển đến máy chủ quản lý
nút ptit. Máy chủ quản lý nút tìm kiếm tại nút lá www
để lấy địa chỉ của tên miền,
kết quả lần lượt chuyển ngược
lại cho đến máy chủ tên miền gốc và
trả về cho máy khách, khi đó tiến trình phân giải
tên miền sẽ trả về cho tiến trình của
ứng dụng đã yêu cầu.

Nhược điểm
của phương pháp phân giải đệ qui nằm
ở việc yêu cầu hiệu năng cao đối
với các máy chủ phân giải tên, mỗi máy chủ
sẽ phải đảm nhiệm việc phân giải hoàn
chỉnh đối với đường dẫn đã
yêu cầu. Tải cao nhất xảy ra tại máy chủ
tên miền gốc, do đó máy chủ này chỉ nên hỗ
trợ cho phân giải tên theo phương pháp tương
tác. Ưu điểm của phương pháp phân giải
đệ qui nằm ở hiệu quả sử dụng
bộ nhớ đệm tốt hơn và có thể giảm
lượng thông tin trao đổi trên mạng, địa
chỉ của các máy chủ định danh cấp thấp
hơn lần lượt được lưu trong bộ
nhớ đệm, điều đó sẽ cải
thiện đáng kể hiệu năng cho hệ thống.
Các nút mức toàn cầu mà mức quản trị
thường ít khi thay đổi, máy chủ gốc sử
dụng bộ nhớ đệm hiệu quả hơn so
với phương pháp tương tác, các máy chủ
cấp thấp hơn cũng quản lý bộ nhớ
đệm theo cách tương tự. Kết quả tra
cứu trung gian cũng có thể được lưu vào
bộ nhớ đệm, kết quả tổng thể quá
trình phân giải và lưu kết quả trong bộ nhớ
đệm như sau:
|
Máy
chủ
|
Yêu
cầu
phân
giải
|
Tìm
kiếm
|
Gửi
cấp
thấp
hơn
|
Nhận
và lưu
bộ
nhớ đệm
|
Trả
kết quả
cho máy
yêu cầu
|
|
ptit
|
<www>
|
#<www>
|
-
|
-
|
#<www>
|
|
edu
|
<ptit,www>
|
#<ptit>
|
<www>
|
#<www>
|
#<ptit>
#<ptit,www>
|
|
vn
|
<edu,ptit,www>
|
#<edu>
|
<ptit,www>
|
#<www>
#<ptit,www>
|
#<edu>
#< edu,ptit>
#<edu,ptit,www>
|
|
Gốc
|
<vn,edu,ptit,www>
|
#<vn >
|
<edu,ptit,www>
|
#<vn>
#<vn,edu >
#<vn,edu,ptit>
|
#<vn>
#<vn,edu>
#<vn,edu,ptit>
#<vn,edu,ptit,www>
|
Lợi ích chính của
phương pháp lưu trữ này là các hoạt động
tra cứu có thể được xử lý khá hiệu
quả, máy chủ cấp trên có thể liên lạc với
bất kỳ máy chủ nào cấp dưới mà không
cần phải đi tuần tự theo các nhánh của cây. Lợi
ích thứ hai là chi phí về truyền thông, các gói tin có
thể sẽ đi qua ít thiết bị định
tuyến hơn nếu các máy chủ phân giải tên miền
được lắp đặt trong cùng khu vực.

Đối với phân giải
tên miền tương tác, bộ nhớ đệm bị
giới hạn cho tiến trình phân giải, nếu
nhiều máy tính trong mạng cục bộ đều có nhu
cầu phân giải một tên miền thì quá trình thực
hiện sẽ như nhau trên tất cả các máy, cho dù
đó là những yêu cầu giống nhau. Giải pháp cho
vấn đề này là xây dựng một máy chủ trung
gian tiếp nhận yêu cầu của máy khách và máy chủ
trung gian đó sẽ tiếp nhận yêu cầu của các
máy khách, máy khách sẽ không liên lạc trực tiếp
đến các máy chủ tên miền. Khi nhận
được yêu cầu phân giải tên miền từ các
máy khách, máy chủ trung gian sẽ tìm kiếm trong bộ
nhớ đệm, nếu tìm thấy bản ghi tên miền
hợp lệ thì trả ngay địa chỉ cho máy khách,
nếu không nó thực hiện quá trình phân giải tương
tác như đã trình bày trên.
Ví dụ cấu hình card mạng trên máy tính qui
định máy chủ phân giải tên có địa chỉ 216.146.35.35.
để phân giải tên miền www.ptit.edu.vn máy khách máy
khách sẽ kiểm tra bộ đệm xem tên miền
đã có trong bộ đệm hay chưa, nếu chưa có
nó sẽ gửi yêu cầu phân giải đến máy
chủ 216.146.35.35, nếu tìm thấy bản ghi của tên
miền trong bộ nhớ đệm thì nó trả về
ngay địa chỉ. Nếu không tìm thấy, máy chủ
trung gian sử dụng phương pháp phân giải tên
miền tương tác, yêu cầu được chuyển
đến máy chủ cấp cao nhất opendns.com, nó trả
về địa chỉ máy chủ quản lý tên miền
vn, kết nối đến máy chủ quản lý nút vn nó
nhận được địa chỉ máy chủ
quản lý nút edu, tiếp tục kết nối đến
máy chủ quản lý nút edu nó nhận được
địa chỉ máy chủ quản lý tên ptit, cuối cùng
kết nối đến máy chủ quản lý nút ptit nó
nhận được địa chỉ của máy
chủ cài đặt dịch vụ web cho tên miền www.ptit.edu.vn,
địa chỉ này sẽ được chuyển cho máy
khách.
Một trong những dịch
vụ đặt tên phân tán lớn nhất hiện nay là
hệ thống tên miền của mạng Internet, hệ
thống này được phát minh vào năm 1984 cho phép
thiết lập tương ứng giữa địa
chỉ IP và tên miền. Hệ thống tên
miền là một hệ thống đặt tên theo thứ
tự cho máy tính, dịch vụ hoặc bất kì nguồn
lực nào tham gia vào mạng Internet. DNS liên kết nhiều
thông tin đa dạng với tên miền được gán
cho những thành phần tham gia và chuyển tên miền thân
thiện với con người vào định danh của
tên đó. Ví dụ tên miền www.ptit.edu.vn dễ nhớ
đối với con người nhưng lại không áp
dụng được cho việc định tuyến,
trước khi tham gia định tuyến tên miền này
sẽ phải được chuyển đổi thành
địa chỉ của máy chủ đang cài đặt
dịch vụ web cho trang này.
Tên miền nên được
đặt đơn giản và có tính chất gợi
nhớ với mục đich và phạm vi hoạt
động của chủ sở hữu tên miền.
Mỗi tên miền gồm tối đa 63 ký tự bao
gồm cả dấu chấm. Tên miền
được đặt bằng các ký tự (a-z A-Z 0-9) và
ký tự gạch ngang “-”, một tên miền đầy
đủ có chiều dài không vượt quá 255 ký tự. Hệ
thống tên miền sẽ phân chia trách nhiệm gán tên
miền và lập bản đồ ánh xạ tên với
địa chỉ IP bằng cách định rõ những máy
chủ có thẩm quyền cho mỗi loại tên miền.
Những máy chủ có thẩm quyền được phân
công chịu trách nhiệm đối với tên miền riêng
của họ và lần lượt có thể chỉ
định tên máy chủ khác cho các tên miền phụ. Ban
đầu, tất cả các tên miền và địa
chỉ IP tương ứng được lưu giữ
trong tập tin tại trung tâm thông tin mạng của
Mỹ. Tuy nhiên khi hệ thống Internet phát triển,
việc lưu giữ thông tin trong một tập không
thể đáp ứng nhu cầu phân phối và cập
nhật, vì vậy hệ thống tên miền DNS đã phát
triển dưới dạng các cơ sở dữ liệu
phân tán, mỗi cơ sở dữ liệu này sẽ
quản lý một phần trong hệ thống tên miền.
Hiện nay hệ thống tên
miền trên thế giới được phân bố theo
cấu trúc hình cây, tên miền cấp cao nhất là tên
miền gốc được thể hiện bằng
dấu chấm. Dưới tên miền gốc có hai
loại tên miền là tên miền cấp cao dùng chung và tên
miền cấp cao quốc gia
như .vn, .jp, .kr, .…. Tên miền cấp cao dùng chung
hiện nay do tổ chức ICANN (Internet Coroperation for
Assigned Names and Numbers) quản lý, tham khảo tại
địa chỉ
https://www.icann.org/resources/pages/listing-2012-02-25-en. Tên miền
cũng có thể được phân theo lĩnh vực
hoạt động gồm các loại sau:
-
COM, BIZ: các
tổ chức, cá nhân hoạt động thương
mại.
-
EDU: các tổ chức, cá nhân hoạt
động trong lĩnh vực giáo dục, đào tạo.
-
GOV: các cơ
quan, tổ chức nhà nước ở trung ương và
địa phương.
-
NET: các tổ
chức, cá nhân hoạt động trong lĩnh vực
thiết lập và cung cấp dịch vụ mạng.
-
ORG: các tổ chức hoạt
động trong lĩnh vực chính trị, văn hoá, xã
hội.
-
INT: các tổ
chức quốc tế.
-
AC: các tổ
chức, cá nhân hoạt động trong lĩnh vực nghiên
cứu.
-
PRO: các tổ
chức, cá nhân hoạt động trong lĩnh vực chuyên
ngành cao.
-
INFO: các
tổ chức, cá nhân hoạt động trong lĩnh
vực cung cấp thông tin.
-
HEALTH: các
tổ chức, cá nhân hoạt động trong lĩnh
vực dược, y tế.
NAME: tên riêng của cá nhân tham gia hoạt
động Internet.
Hệ thống tên miền
được sắp xếp theo cấu trúc phân cấp, mức
trên cùng được gọi là gốc và ký hiệu là “.”, tổ
chức ICANN đảm nhiệm vai trò quản lý mức cao
nhất của hệ thống tên miền mức cao
nhất do đó nó có quyền cấp phát các tên miền
dưới mức này. Giả sử có tên miền www.ptit.edu.vn
sẽ được nhận dạng từ phải qua
trái, mục đầu tiên của tên miền này là vn
nghĩa là thuộc về Việt Nam, tiếp theo đó edu
nghĩa là đơn vị giáo dục, ptit là tên chủ
sở hữu yêu cầu và www
nghĩa là trang tin điện tử. Theo cấu trúc và
cách phân chia trong không gian tên miền đã trình bày ở trên,
người dùng khi gặp một tên miền hoàn toàn có
thể biết tổ chức quản lý tên miền này thuộc
lĩnh vực gì, hay tên miền này do quốc gia nào quản
lý... Tên miền tận cùng bằng .vn do đó tên miền
này thuộc vùng do Việt Nam quản lý, cụ thể là Trung tâm Internet
Việt Nam (VNNIC), tiếp sau là tên miền cấp 2 edu, nghĩa
là tên miền này được phân cho tổ chức
hoạt động trong lĩnh vực giáo dục.
Máy chủ tên miền là máy
chủ chứa cơ sở dữ liệu dùng cho việc
chuyển đổi giữa tên miền và địa
chỉ IP. Như cách phân cấp của hệ thống tên
miền, tương ứng với mỗi cấp và mỗi
loại tên miền có máy chủ tên miền phục vụ
tên miền ở cấp và loại tên miền đó. Máy
chủ tên miền gốc sẽ chứa cơ sở
dữ liệu quản lý tên miền ở mức toàn
cầu, ở mức quốc gia sẽ có máy chủ tên
miền quản lý tên miền mức quốc gia. Hệ
thống tên miền định nghĩa hai kiểu máy
chủ tên miền là máy chủ tên miền chính và máy chủ
tên miền phụ. Máy chủ tên miền chính là máy chủ
tên miền lấy dữ liệu cho các vùng của nó từ
các tập tin có sẵn trên máy, máy chủ tên miền phụ
là máy chủ tên miền lấy dữ liệu cho các khu
vực của nó từ một máy chủ tên miền chính
khác. Khi máy chủ phụ khởi động nó sẽ
kết nối đến máy chủ chính để lấy
dữ liệu từ máy này về cho các khu vực mà nó
quản lý, quá trình lấy dữ liệu từ máy chính
về máy phụ được gọi là chuyển vùng.
Máy chủ tên miền ở
mức cao nhất là máy chủ tên miền chứa các thông
tin để tìm kiếm các máy chủ tên miền ủy
quyền cho các tên miền thuộc mức cao nhất. Máy
chủ gốc có thể đưa ra các truy vấn để tìm kiếm tối
thiểu là các thông tin về địa chỉ của các
máy chủ tên miền ủy quyền thuộc mức cao
nhất chứa tên miền muốn tìm. Sau đó, các máy
chủ tên miền ở mức top-level-domain có thể cung
cấp các thông tin về địa chỉ của máy
chủ ủy quyền cho tên miền ở mức thứ
cấp chứa tên miền muốn tìm, quá trình tìm kiếm
tiếp tục cho đến khi chỉ ra được
máy chủ tên miền authority cho tên miền muốn tìm. Theo
cơ chế hoạt động trên máy chủ tên miền
đóng vai trò quan trọng trong việc tìm kiếm một
tên miền bất kỳ trên không gian tên miền. Quá trình tìm
kiếm tên miền luôn được bắt đầu
bằng các truy vấn gửi cho máy chủ gốc, nếu
như các máy chủ tên miền gốc không hoạt
động, quá trình tìm kiếm tên miền sẽ không
được thực hiện. Để tránh điều
này không xảy ra, trên mạng Internet hiện tại có 13
hệ thống máy chủ tên miền gốc, các máy chủ
tên miền này nói chung và ngay trong cùng một hệ thống
cũng được đặt tại nhiều vị
trí khác nhau trên mạng Internet.
Giả sử người
sử dụng muốn truy cập vào trang tin điện
tử có tên miền là www.vnn.vn. Trước hết
chương trình trên máy người sử dụng gửi
yêu cầu tìm kiếm địa chỉ IP ứng với
tên miền www.vnn.vn
tới máy chủ quản lý tên miền cục bộ
thuộc mạng của nó. Máy chủ tên miền cục
bộ này kiểm tra trong cơ sở dữ liệu
của nó có chứa cơ sở dữ liệu chuyển
đổi từ tên miền sang địa chỉ IP
của tên miền mà người sử dụng yêu cầu
không. Trong trường hợp máy chủ tên miền cục
bộ có cơ sở dữ liệu này, nó sẽ gửi trả
lại địa chỉ IP của máy có tên miền nói trên.
Trong trường hợp máy chủ tên miền cục
bộ không có cơ sở dữ liệu về tên miền
này nó sẽ hỏi lên các máy chủ tên miền ở
mức cao nhất, nghĩa là máy chủ tên miền làm
việc ở mức ROOT. Máy chủ tên miền ở
mức ROOT này sẽ chỉ cho máy chủ tên miền
cục bộ địa chỉ của máy chủ tên
miền quản lý các tên miền .VN, máy chủ tên miền
cục bộ gửi yêu cầu đến máy chủ
quản lý tên miền .VN tìm tên miền www.vnn.vn. Máy chủ tên miền
quản lý các tên miền .VN sẽ gửi lại
địa chỉ của máy chủ quản lý tên miền
vnn.vn.

Hình 3.8 Các
bước thực hiện trong phân giải tên miền
Máy chủ tên
miền cục bộ sẽ hỏi máy chủ quản lý
tên miền vnn.vn này địa chỉ IP của tên
miền www.vnn.vn. Do máy
chủ quản lý tên miền vnn.vn có cơ sở dữ
liệu về tên miền www.vnn.vn nên địa
chỉ IP của tên miền này sẽ được
gửi trả lại cho máy chủ tên miền cục
bộ. Máy chủ tên miền cục bộ chuyển thông
tin tìm được đến máy của người
sử dụng. Người sử dụng dùng
địa chỉ IP này để kết nối
đến server chứa trang web có địa chỉ www.vnn.vn. Khi khai báo tên miền, các bản ghi dữ
liệu tên miền gồm những loại sau:
-
Bản ghi kiểu A: được dùng
để khai báo ánh xạ giữa tên của một máy tính
trên mạng và địa chỉ IP tương ứng
của nó. Nói cách khác, bản ghi kiểu A chỉ ra tên và
điạ chỉ IP của một máy tính trên mạng.Bản
ghi kiểu A có cú pháp như sau:
domain IN A <địa
chỉ IP của máy>
Ví dụ: home.vnn.vn IN A 203.162.0.12
Theo ví dụ trên, tên miền
home.vnn.vn được khai với bản ghi kiểu A
trỏ đến địa chỉ 203.162.0.12 sẽ là tên
của máy tính này. Một tên miền có thể
được khai nhiều bản ghi kiểu A khác nhau
để trỏ đến các địa chỉ IP khác
nhau. Như vậy có thể có nhiều máy tính có cùng tên trên
mạng. Ngược lại một máy tính có một
địa chỉ IP có thể có nhiều tên miền
trỏ đến, tuy nhiên chỉ có duy nhất một tên
miền được xác định là tên của máy,
đó chính là tên miền được khai với bản
ghi kiểu A trỏ đến địa chỉ của
máy.
-
Bản ghi
AAAA: được dùng để chuyển đổi
từ tên miền sang địa chỉ IPv6. Giống
như bản ghi kiểu A trong địa chỉ IPv4,
một tên miền có thể được khai nhiều
bản ghi kiểu AAAA khác nhau để trỏ đến
các địa chỉ IPv6 khác nhau. Bản ghi kiểu AAAA có
cú pháp như sau:
domain IN AAAA <địa
chỉ IPv6 của máy>
Ví dụ:
ipv6.vnnic.net IN AAAA 2001:dc8:5::115
Khai báo trên cho thấy tên
miền ipv6.vnnic.net là tên được đặt cho
máy tính có địa chỉ 2001:dc8:5::115 trên mạng Internet.
-
Bản ghi CNAME: Bản ghi CNAME cho phép
một máy tính có thể có nhiều tên, nói cách khác bản ghi
CNAME cho phép nhiều tên miền cùng trỏ đến
một địa chỉ IP cho trước. Để có
thể khai báo bản ghi CNAME, bắt buộc phải có
bản ghi kiểu A để khai báo tên của máy. Tên
miền được khai báo trong bản ghi kiểu A
trỏ đến địa chỉ IP của máy
được gọi là tên miền chính (canonical domain). Các
tên miền khác muốn trỏ đến máy tính này phải
được khai báo là bí danh của tên máy (alias domain). Cú
pháp của bản ghi CNAME:
alias-domain IN CNAME canonical domain.
Ví dụ:
www.vnn.vn IN CNAME home.vnn.vn.
Tên miền www.vnn.vn sẽ là tên bí danh của tên miền home.vnn.vn , hai tên
miền www.vnn.vn và home.vnn.vn sẽ cùng trỏ đến
địa chỉ IP 203.162.0.12.
-
Bản ghi MX:
dùng để khai báo trạm chuyển tiếp thư
điện tử của một tên miền. Ví dụ,
để các thư điện tử có cấu trúc user@vnn.vn được gửi đến
trạm chuyển tiếp thư điện tử có tên
mail.vnn.vn , trên cơ sở dữ liệu của DNS cần
khai báo bản ghi MX như sau:
vnn.VN IN MX 10 mail.vnn.vn
Các thông số được khai báo trong
bản ghi MX nêu trên gồm có:
vnn.vn : là tên miền được khai
báo để sử dụng như địa chỉ
thư điện tử.
mail.vnn.vn: là tên của trạm chuyển
tiếp thư điện tử, nó thực tế là tên
của máy tính dùng làm trạm chuyển tiếp thư
điện tử.
10 : Là giá trị ưu tiên, giá trị
ưu tiên có thể là một số nguyên bất kỳ
từ 1đến 255, nếu giá trị ưu tiên này càng
nhỏ thì trạm chuyển tiếp thư điện
tử được khai báo sau đó sẽ là trạm
chuyển tiếp thư điện tử được
chuyển đến đầu tiên. Ví dụ nếu
khai báo:
vnn.vn IN MX 10 mail.vnn.vn
vnn.vn IN MX 20 backupmail.vnn.vn
thì tất cả các thư điện
tử có cấu trúc địa chỉ user@vnn.vn trước hết sẽ
được gửi đến trạm chuyển
tiếp thư điện tử mail.vnn.vn. Chỉ trong
trường hợp máy chủ mail.vnn.vn không thể
nhận thư thì các thư này mới được
chuyển đến trạm chuyển tiếp thư
điện tử backupmail.vnn.vn.
-
Bản ghi NS:
dùng để khai báo máy chủ tên miền cho một tên
miền, nó cho biết các thông tin về tên miền này
được khai báo trên máy chủ nào. Với mỗi
một tên miền phải có tổi thiểu hai máy chủ
tên miền quản lý, do đó yêu cầu có tối thiểu
hai bản ghi NS cho mỗi tên miền. Cú pháp của bản ghi
NS:
<tên
miền> IN NS <tên của máy chủ tên
miền>
Ví dụ:
vnnic.net.VN. IN NS dns.vnnic.net.vn.
Với khai báo trên, tên miền vnnic.net.vn sẽ do máy chủ
tên miền có tên dns.vnnic.net.vn quản lý. Điều này có
nghĩa, các bản ghi như A, CNAME, MX ... của tên
miền vnnic.net.vn và các tên miền cấp dưới
của nó sẽ được khai báo trên máy chủ
dns.vnnic.net.vn.
-
Bản ghi PTR: Hệ thống DNS không
những thực hiện việc chuyển đổi
từ tên miền sang địa chỉ IP mà còn thực
hiện chuyển đổi địa chỉ IP sang tên
miền. Bản ghi PTR cho phép thực hiện chuyển
đổi địa chỉ IP sang tên miền.Ví dụ:
12.0.162.203.in-addr.arpa IN PTR home.vnn.vn
Bản ghi PTR trên cho phép tìm tên miền home.vnn.vn khi biết
địa chỉ IP mà tên miền trỏ tới.
-
Bản ghi NAPTR: là bản ghi đặc
biệt trong hệ thống tên miền, chứa
đựng thông tin về các nguồn, những dịch
vụ và ứng dụng nào sẽ được kết
hợp với một số điện thoại xác
định. Những dịch vụ này được xác
định và lựa chọn bởi khách hàng.
Cú pháp của bản ghi NAPTR:
<tên miền>IN NAPTR<thứ
tự><mức ưu tiên><cờ><dịch vụ><biểu
thức><thay thế>
Ví dụ:
5.1.1.6.2.2.8.4.4.8.e164.arpa.IN NAPTR 10 10 “u”“mailto+E2U”“!^.*$!mailto:xxx@vnnic.net!”
Với khai báo trên, khi thực hiện gọi số máy +84-xx-xxxxxxxx
thì sẽ thu được mailto:xxx@vnnic.net. Với bản
ghi này có thể triển khai dịch vụ dựa trên
hệ thống máy chủ DNS như ENUM và có thể mang
lại sự hội tụ giữa viễn thông và Internet.
Đặt tên phi cấu
trúc hay đặt tên có cấu trúc đều bảo
đảm tham chiếu đến
một thực thể duy nhất một cách độc
lập với vị trí của thực thể đó. Trong
thực tế, hai tiêu chí thân thiện với người
dùng và độc lập vị trí là chưa đủ,
người dùng muốn tìm kiếm các thực thể
dựa trên các thuộc tính của chúng, mô tả càng
nhiều thuộc tính càng tốt. Có nhiều cách mô tả thực
thể nhưng cách phổ biến là mô tả thực
thể theo cặp thuộc tính và giá trị, phương
pháp này gọi là đặt tên theo thuộc tính. Một
thực thể bao gồm nhiều thuộc tính liên quan
với nhau, mỗi thuộc tính thể hiện đặc
điểm của thực thể, bằng cách xác
định giá trị của các thuộc tính sẽ hạn
chế được tập các thực thể cần
tìm.
Nếu tên
được phân ra thành nhiều thuộc tính thì có
thể lợi dụng thứ tự các thuộc tính, ví
dụ người sử dụng với thuộc tính tên là
<A>, thuộc tính tổ chức là <FOT> và thuộc
tính quốc gia là <VN> thì có thể tạo ra thành một
thuộc tính tổng hợp là <A.FOT.VN>. Tổng quát
hơn, khi không cho thứ tự các thuộc tính thì có
thể xác đinh thực thể nhờ tập hợp
tất cả các thuộc tính, ví dụ U=A, C=FOT, O=VN, trong
đó đó U, C và O đại diện cho các thuộc tính
tên, cơ quan và quốc gia. Những tên này được
xác định dựa vào việc ghép nối kế tiếp
các thuộc tính dựa vào tên cấu trúc phân cấp hoặc
dựa vào chỉ tập hợp các thuộc tính với
cấu trúc tùy ý. Việc phân chia thuộc tính cho giải pháp
tên của đối tượng có thể căn cứ
vào tính chất vật lý, theo tổ chức hoặc theo
chức năng.
Hệ thống
đặt tên dựa trên thuộc tính còn gọi là dịch
vụ thư mục, mỗi thực thể có tập các
thuộc tính liên quan dùng để tìm kiếm. Xác
định các thuộc tính cho thực thể không phải
là vấn đề đơn giản, trong nhiều
trường hợp cần phải thực hiện
thủ công. Dịch vụ thư mục tương tự
với một từ điển, nó cho phép tra cứu tên và
thông tin liên kết với tên đó. Mỗi từ có thể
hiểu theo nhiều nghĩa, do đó một tên có thể
được kết hợp với nhiều thông tin khác
nhau. Thực tế cho thấy ngay cả khi có sự
đồng thuận về tập các thuộc tính thì
vẫn chưa chắc đạt được tính
nhất quán cho một nhóm người dùng. Để
giảm bớt sự phức tạp này, các nghiên cứu
đã được tiến hành nhằm thống nhất
cách mô tả các thực thể, một khung mô tả tài nguyên
đã được sử dụng trong các hệ thống
phân tán, về cơ bản nó là cặp ba (chủ thể,
thuộc tính và giá trị), nếu lưu trữ bản ghi
này thì có thể truy vấn theo thuộc tính để tìm
thông tin liên quan đến chủ thể.
Mỗi tài nguyên trên
mạng được xem là một đối
tượng trong thư mục máy chủ, thông tin về
một tài nguyên được lưu giữ như là
thuộc tính của đối tượng đó. Khác
với hệ thống đặt tên có cấu trúc, việc
tìm kiếm giá trị trong hệ thống đặt tên
dựa trên thuộc tính đòi hỏi tìm kiềm toàn
diện thông qua tất cả các bộ mô tả, có thể
tránh được tìm kiếm toàn diện bằng cách
lập các bảng chỉ mục. Khi tìm kiếm chỉ
cần gửi yêu cầu đến các máy chủ dịch
vụ thư mục, nhưng số lượng rất
lớn, gửi hàng trăm câu lệnh truy vấn không phải
là cách hay, do đó cần phải có các giải pháp tìm
kiếm đối với loại hình này.
Cách tiếp cận
phổ biến để giải quyết dịch vụ
thư mục phân tán là kết hợp đặt tên có
cấu trúc với đặt tên dựa trên thuộc tính, nó
đã được áp dụng rộng rãi trong các dịch
vụ hệ thống phân tán. Nhiều hệ thống
sử dụng hoặc dựa vào giao thức truy nhập
hạng nhẹ (LDAP), nó bắt nguồn từ dịch
vụ thư mục X.500 do hai tổ chức quốc
tế ITU và ISO xây dựng. Ban đầu tiêu chuẩn này
dùng để để hỗ trợ các yêu cầu của
các nhà cung cấp dịch vụ nhắn tin và tra cứu tên
mạng. Giao thức LDAP dựa trên các dịch vụ
thư mục thông tin của X.500 nhưng sử dụng
TCP/IP và một chuỗi mã hóa chương trình của giao
thức X.500 DAP, nó liên quan nhiều hơn trên Internet. Một
dịch vụ thư mục LDAP bao gồm các bản ghi
thể hiện các phần trong thư mục, mỗi bản
ghi là tập hợp của các cặp (thuộc tính, giá
trị), mỗi thuộc tính có một kiểu liên kết,
nó có thể là đơn trị hoặc đa trị.
|
Thuộc
tính
|
Viết
tắt
|
Giá
trị
|
|
Country
|
C
|
vn
|
|
Locality
|
L
|
Hanoi
|
|
Organization
|
O
|
Ministry of Information and Communications
|
|
Organization Unit
|
OU
|
Posts and Telecommunications Institute of Technology
|
|
CommonName
|
CN
|
Main server
|
|
WebServer
|
-
|
222.255.113.97, 203.162.88.119,
203.162.10.122
|
|
MailServer
|
-
|
123.30.182.167
|
Ví dụ trên sử dụng tiêu chuẩn
LDAP để mô tả Học viện Công nghệ Bưu
chính viễn thông, thuộc tính WebServer nhận dữ
liệu đa trị, các thuộc tính khác nhận dữ
liệu đơn trị. Tập hợp tất cả các
mục trong dữ liệu của LDAP gọi là cơ
sở thông tin thư mục, mỗi bản ghi
được xác định duy nhất để có thể
tra cứu, một tên duy nhất trên toàn cầu xuất
hiện dưới dạng chuỗi các thuộc tính
đặt tên trong mỗi bản ghi, mỗi thuộc tính
đặt tên gọi là tên phân biệt tương
đối. Trong ví dụ trên, năm thuộc tính
đầu tiên đều là các thuộc tính đặt tên,
chúng tạo thành tên duy nhất trên toàn cầu, tương
tự như tên miền ptit.edu.vn. Giống như hệ
thống tên miền, việc sử dụng các tên duy
nhất trên toàn cầu bằng cách liệt kê các tên
tương đối theo thứ tự dẫn đến
hệ thống phân cấp của tập hợp các mục
dữ liệu và được gọi là cây thông tin thư
mục, đó là đồ thị tên của dịch vụ
thư mục.

|
Thuộc
tính
|
Giá
trị
|
Thuộc
tính
|
Giá
trị
|
|
Country
|
vn
|
Country
|
vn
|
|
Locality
|
Hanoi
|
Locality
|
Hanoi
|
|
Organization
|
Ministry
of Information and Communications
|
Organization
|
Ministry
of Information and Communications
|
|
Organization Unit
|
Posts and
Telecommunications Institute of Technology
|
Organization Unit
|
Posts and
Telecommunications Institute of Technology
|
|
CommonName
|
Main server
|
CommonName
|
Main server
|
|
HostName
|
web
|
HostName
|
mail
|
|
HostAddress
|
222.255.113.97, 203.162.88.119,
203.162.10.122
|
HostAddress
|
123.30.182.167
|
Nút N đóng vai trò là nút thư mục và
là cha của hai nút lá thuộc tính bổ sung HostName, nó
đóng vai trò như một nút thư mục trên đồ
thị tên và cũng là bản ghi của LDAP, thao tác
đọc (read) sẽ dùng để đọc bản ghi
duy nhất có tên đường dẫn trong cây thông tin
thư mục, thao tác liệt kê (list) các cạnh của
đi ra từ một nút. Việc cài đặt dịch
vụ thư mục tương tự như cách triển
khai dịch vụ đặt tên, nó hỗ trợ nhiều
thao tác tra cứu hơn. Khi xử lý thư mục có qui mô
lớn, cây thông tin thư mục sẽ được cài
đặt trên máy chủ gọi là đại lý dịch
vụ thư mục (DSA), mỗi phần của cây thông tin
thư mục sẽ tương ứng với một vùng
trong hệ thống đặt tên, mỗi DSA hoạt
động như một máy chủ định danh thông
thường nhưng có thêm các tính năng tìm kiếm nâng
cao. Trên máy khách có một tiến trình phân giải tên gọi
là DSA, nó trao đổi thông tin với DUA theo giao thức
truy nhập đã được chuẩn hóa.
Điểm khác biệt giữa LDAP và DNS
nằm ở các phương tiện tìm kiếm thông qua
cơ sở thông tin thư mục, nó tìm kiếm các mục
dựa trên các tiêu chí của các thuộc tính đã nhập.
Ví dụ, để tìm kiếm các máy chủ chính của các
đơn vị trực thuộc Bộ thông tin và
truyền thông Việt Nam chỉ cần thực hiện
lệnh sau:
search(“(C=vn)(O= Ministry of Information and Communications)
(OU=*)
(CN=Main
server)”)
Tìm kiếm trong dịch vụ thư
mục thường là hoạt động tốn kém, câu
lệnh trên đòi hòi phải tìm kiếm các mục dữ
liệu cho mỗi đơn vị của Bộ thông tin và
truyền thông sau đó kết hợp kết quả tìm
kiếm với nhau, nghĩa là phải truy nhập vào
một số nút lá của cây thông tin thư mục, trong khi
đó dịch vụ tên miền chỉ cần truy nhập
một nút lá duy nhất. LDAP cho phép một số cây cùng
tồn tại trong khi chúng được liên kết
với nhau, điều này dẫn đến một
rừng các miền LDAP, do đó cần cài đặt
một máy chủ danh mục chung để chỉ ra
cần tìm kiếm trên những miền nào. Mặc dù
bản thân LDAP sử dụng hệ thống phân cấp
để đáp ứng yêu cầu về qui mô, thông
thường người ta kết hợp LDAP với DNS,
khi đó mọi cây trong LDAP đều có thể truy
nhập từ gốc. Tiêu chuẩn LDAP/X.500 đang
được áp dụng phổ biến trong các sản
phẩm như Novell eDirectory, Red Hat Directory Server, Microsoft
Active Directory, Apple’s Mac Open Directory, Apache Directory Server, Oracle Internet
Directory.
Với sự ra đời của các
hệ thống ngang hàng, các nhà nghiên cứu cũng đang
tìm kiếm những giải pháp phi tập trung hóa hệ
thống đặt tên dựa trên thuộc tính. Hệ
thống ngang hàng thường được sử
dụng để lưu trữ các tập tin, nó chỉ
cung cấp tính năng tra cứu dựa trên khóa mà không
hỗ trợ các tính năng tìm kiếm. Tuy nhiên, nếu có
thể tìm kiếm được tập tin dựa trên
bộ mô tả thì đó là điều rất tiện
lợi, trong đó bộ mô tả là cặp (thuộc tính,
giá trị), vấn đề mấu chốt ở đây
là phải tổ chức sao cho quá trình tìm kiếm thực
hiện tốt nhất. Việc truy vấn mọi mút trong
hệ thống ngang hàng để xem nó có chứa tập
tin khớp với các cặp thuộc tính hay không là
điều không khả thi, những gì cần làm là ánh
xạ các cặp (thuộc tính, giá trị) đến các máy
chủ chỉ mục trở đến các tập tin phù
hợp với các cặp thuộc tính và giá trị đó.
Ý tưởng xây dựng cây chỉ
mục phân tán là truy vấn tìm kiếm được
thể hiện dưới dạng danh sách các cặp (thuộc
tính, giá trị), kết quả trả về là danh sách tham
chiếu đến các thực thể phù hợp với
những giá trị của các thuộc tính. Ví dụ
trường hợp hệ thống ngang hàng lưu trữ
tập tin, danh sách trả về là các khóa của các tập
tin có liên quan, từ đó máy khách có thể sử dụng
lần lượt từng khóa để tra cứu các
tập tin. Giả sử có M thuộc tính khác nhau, có thể
sử dụng máy chủ nào đó cho mỗi thuộc tính,
máy chủ cho thuộc tính A duy trì tập hợp các cặp
(E, ValA) cho mỗi thực thể E có giá trị ValA cho
thuộc tính A, một câu truy vấn tìm kiếm
search(“(C=vn)(O= Ministry of Information and Communications)
(OU=*)
(CN=Main
server)”)
sẽ được gửi đến
các máy chủ tương ứng cho các thuộc tính C, O và CN,
sau đó máy khách sẽ xem thực thể nào xuất
hiện trong cả ba tập hợp do các máy chủ trả
về, mỗi máy chủ có thể phân vùng thêm để
giảm số lượng tập thực thể trên
mỗi máy. Giả sử có tập thuộc tính {a1,a2,..,aN},
mỗi thuộc tính ak liên kết với tập Sk
= {Sk1,.., Sknk} của nk
máy chủ và ak nhận giá trị từ tập Rk,
xây dựng ánh xạ toàn cục F như sau:
F(ak, v) = Skj với
Skj ϵ Sk
và v ϵ Rk
Áp
dụng cho câu lệnh tìm kiếm trong ví dụ trên, máy
chủ Sk theo dõi mỗi khóa liên quan với tập
tin có ak = v. Nếu L(ak, v) là tập các khóa
trả về từ máy chủ F(ak, v) thì truy
vấn có thể viết dưới dạng biểu
thức logic (F(a1, v1) ˄ F(a2, v2))
˅ F(a3, v3), nghĩa là có thể
được máy khách xử lý (L(a1, v1) Ո
L(a2, v2)) Ս L(a3, v3).
Giải pháp trên có ưu điểm khá
đơn giản nhưng nó lại tiềm ẩn ba
yếu điểm cơ bản. Thứ nhất chi phí
về truyền thông có thể rất cao, bất kỳ truy
vấn nào liên quan đến k thuộc tính thì phải liên
hệ với k máy chủ chỉ mục. Nhược
điểm thứ hai là tập kết quả trả
về cho máy khách có thể rất lớn, thực tế
tập khóa trả về cho thuộc tính C=vn có thể lên
tới hàng triệu bản ghi. Nhược điểm
thưa ba là nó không hỗ trợ cho việc tìm kiếm theo
phạm vi, giả sử có thêm thuộc tính không xác
định SumWorkers, khó có thể thực hiện truy
vấn những đơn vị có số nhân viên trong
khoảng từ 1000 đến 2000.
Một cách tiếp cận khác để
cài đặt hệ thống đặt tên dựa trên
thuộc tính theo cách không tập trung là sử dụng
phương pháp đường cong lấp đầy không
gian. Ý tưởng cơ bản là lập bản đồ
không gian N chiều bao phủ bởi N thuộc tính {a1,a2,..,aN}
cho mỗi chiều, sau đó sử dụng kỹ thuật
băm để phân phối không gian kết quả
giữa các máy chủ chỉ mục, điều quan
trọng ở đây là phải có các cặp (thuộc tính,
giá trị) gần với nhau để xử lý trên cùng
một máy chủ.
Ví dụ xem xét đường cong lấp
đầy không gian Hilbert, điều này dễ giải
thích bằng không gian hai chiều tượng trưng cho hai
thuộc tính, mỗi thuộc tính tương ứng
với một trục của không gian. Giả sử
mỗi thuộc tính chỉ nhận các giá trị trong
khoảng [0,1], đầu tiên chia không gian thành bốn
phần tương ứng với bốn chỉ số.
Tất cả các dữ liệu (x, y) với 0 ≤ x, y < 0,5 liên kết với chỉ
số 0, các dữ
liệu (x, y)
với 0.5 ≤ x, y
<
1.0 liên kết
với chỉ số 2. Có thể lặp lại qui trình này
theo phương pháp đệ qui cho mỗi phần con và
nối các phần bằng một đường duy
nhất, đường cong Hilbert bậc k sẽ nối 22k ô tương
ứng với 22k chỉ mục.
Tính chất quan trọng của
đường cong lấp đầy không gian là chúng
bảo toàn tính cục bộ, hai chỉ mục gần nhau
trên đương cong tương ứng với hai
điểm cũng gần nhau trong không gian đa chiều,
điều ngược lại chưa chắc đã
đúng. Các giá trị của thuộc tính cần phải
được lập chỉ mục, giả sử có N
thuộc tính {a1,a2,..,aN} và mỗi
thực thể gán một giá trị cho từng thuộc
tính, để đơn giản chúng ta coi các giá trị này
đã được chuẩn hóa nằm trong khoảng [0,
1]. Như vậy mỗi thực thể E sẽ có bộ
giá trị {v1,v2,..,vN}
được liên kết với một tọa đọ
có giá trị thực trong không gian N chiều, kết quả
là nó được liên kết duy nhất với một ô
con trong N chiều. Tâm của ô con đó tương ứng
với chỉ mục trên đường cong lấp
đầy không gian và giờ đây nó liên kết với
thực thể E. Tất nhiên nhiều thực thể có
tọa độ rơi vào cùng một ô sẽ có cùng
chỉ mục, để tránh xung đột này thì sử
dụng bậc cao hơn, bậc 32 hay 64 không phải là
hiếm.
Nguyên lý tìm kiếm các thực thể
dựa trên các giá trị thuộc tính cũng đã rõ ràng,
giả sử các giá trị thuộc tính a1, a2
nằm trong khoảng [v1l,v1u]
và [v2l,v2u] với vil<viu
, các tọa độ đó phân định các ô mà
đường cong đi qua, tất cả các tập tin được
đánh chỉ mục bởi những đoạn
đường cong giao với các ô đó phù hợp với
tiêu chí tìm kiếm. Do đó cần phải có thao tác trả
về dãy các chỉ mục liên quan đến
đường cong cho một vùng trong không gian N chiều có
liên quan, thao tác như vậy phụ thuộc vào
đường cong lấp đầy không gian nào đã
được sử dụng mà không phụ thuộc vào các
thực thể. Cuối cùng là việc tham chiếu
đến các thực thể liên quan tới các chỉ
mục, một trong những giải pháp lựa chọn là
sử dụng giải thuật Chord.
CHƯƠNG 4:
ĐỒNG
BỘ VÀ CÁC GIẢI THUẬT PHÂN TÁN
Trao đổi thông tin giữa các
tiến trình là nhiệm vụ quan trọng
trong các hệ thống phân tán, tuy nhiên nhiệm đó chưa
phải là tất cả, vấn đề đặt ra là
làm thế nào để các tiến trình có thể phối
hợp và đồng bộ với nhau. Ví dụ vấn đề sử
dụng chung tài nguyên vật lý, các tiến trình không thể
đồng thời truy nhập mà mỗi tiến trình sẽ
được cấp phép chiếm giữ tạm thời
trong một khoảng thời gian nhất định
đối với tài nguyên vật lý đó, như vậy
đòi hỏi phải có các thuật toán phân phối
quyền sử dụng tài nguyên trong hệ thống.
Một ví dụ khác đó là một tiến trình nhận
được thông điệp được gửi
từ nhiều tiến trình khác, vậy cần phải
quyết định ưu tiên thông điệp nào
được xử lý trước. Đồng bộ và
phối hợp là hai việc liên quan mật thiết
với nhau, trong khi đồng bộ tiến trình đòi
hỏi một tiến trình phải chờ tiến trình khác
hoàn thành công việc của mình thì đồng bộ dữ
liệu lại chú trọng đến tính nhất quán
giữa các bản sao.
Nói về sự phối
hợp, mục tiêu của nó là phải quản lý
được các tương tác và phụ thuộc lẫn
nhau giữa các hoạt động trong hệ thống phân
tán, từ đó có thể thấy đồng bộ
chỉ là một phần của phối hợp hoạt
động. Đồng bộ trong hệ thống phân tán
phức tạp hơn rất nhiều so với các hệ
thống xử lý trên một máy tính, nhất là đối
với các ứng dụng yêu cầu xử lý theo thời
gian thực. Mỗi thành viên trong hệ thống phân tán
sử dụng đồng hồ vật lý riêng, không có gì
đảm bảo rằng tại một thời
điểm đồng hồ vật lý của tất
cả các thành viên trong hệ thống đều có giá
trị giống nhau. Chương này sẽ giới
thiệu các giải thuật cơ bản phục vụ
cho việc phối hợp các tiến trình cho hệ
thống phân tán, trước hết là các giải thuật
đồng bộ thời gian, sau đó sẽ đề
cập tới các giải thuật loại trừ
tương hỗ phân tán và các giải thuật bầu
chọn.
Thời gian trên một
máy tính thể hiện rất rõ ràng vì nó chỉ sử
dụng duy nhất một đồng hồ vật lý,
một tiến trình khi cần biết thời gian chỉ
cần thực hiện lời gọi và bộ đếm
thời gian cài đặt trong phần lõi của hệ
thống sẽ trả lời. Nếu hai tiến trình yêu
cầu thời gian hệ thống thì giá trị thời
gian của tiến trình gọi trước bao giờ
cũng nhỏ hơn giá trị thời gian của tiến
trình gọi sau. Trong các hệ thống phân tán, để
đạt được sự đồng thuận về
thời gian giữa các thành viên là một vấn đề
không đơn giản, chúng ta sẽ xem xét trường
hợp biên dịch tập tin của dự án phát triển
phần mềm trong môi trường phân tán.

Hình 4.1 Hai máy tính có thời gian khác nhau
Để hiểu về nhu cầu
đồng bộ thời gian giữa các thành phần trong
hệ thống phân tán, chúng ta hãy xem xét trường hợp
truy nhập tập tin trên hình 4.1, máy tính thứ nhất có
thời gian nhanh hơn máy tính thứ hai và cả hai máy tính
này đều không sử dụng đồng hồ toàn
cục. Lập trình viên cùng biên soạn tập tin output.c sau
đó sẽ biên dịch để được tập
tin output.obj. Phần mềm biên dịch thực hiện theo
nguyên tắc, trước hết nó kiểm tra tất
cả các tập tin nguồn, nếu thời gian tập tin
mã nguồn nhỏ hơn thời gian tập tin .obj
tương ứng đã được biên dịch
gần nhất thì tập tin mã nguồn đó sẽ không
được biên dịch.
Tại thời điểm máy tính
thứ nhất biên dịch, đồng hồ là 2144, trong
khi đó đồng hồ trên máy tính thứ hai là 2142,
như vậy tập tin output.obj sẽ ghi nhận thời
gian được biên dịch là 2144. Sau một đơn
vị thời gian, lập trình viên trên máy tính thứ hai
thực hiện biên dịch, chương trình dịch
sẽ kiểm tra thời gian cuối cùng biên dịch
tập tin output.obj là 2044 cao hơn thời gian hiện hành 2143 máy tính thứ hai, do đó
nó không thực hiện biên dịch mặc dù tập tin
output.c đã được chỉnh sửa. Như vậy
đã xảy ra vấn đề ghi nhận thời gian
cập nhật gần nhất đối với tập
tin output.c và lập trình viên
trên máy tính thứ hai khó có thể xác định nguyên nhân
lỗi trong trường hợp này. Từ ví dụ trên có
thể thấy vai trò quan trọng của thời gian trong
các hệ thống phân tán, lỗi trên có thể sẽ không
xảy ra nếu như tập tin output.c được gán
nhãn thời gian của một đồng hồ vật lý
chung của toàn hệ thống. Vậy câu hỏi
đặt ra là có một cơ chế nào để
đồng bộ tất cả các đồng hồ trong
hệ thống phân tán hay không, câu trả lời
tưởng chừng đơn giản nhưng thực
tế lại khá phức tạp.
Thời gian đóng vai trò rất quan
trọng trong các hệ thống thông tin, nếu trên một
máy tính thì giá trị thời gian đọc sau không bao
giờ nhỏ hơn lần đọc trước. Hầu
hết các máy tính đều có một vi mạch để
duy trì thời gian, ngôn ngữ phổ thông gọi là
đồng hồ nhưng chính xác hơn phải gọi là
bộ đếm thời gian máy tính. Bộ đếm
thời gian trong máy tính là một bộ dao động tinh
thể thạch anh, tần suất dao động của
nó phụ thuộc vào loại tinh thể và hiệu
điện thế cài đặt trong vi mạch. Trong vi
mạch này có hai thanh ghi, một thanh ghi dùng làm bộ
đếm và một thanh ghi dùng để lưu trữ,
sau mỗi dao động của tinh thể bộ
đếm sẽ giảm 1 đơn vị, khi đạt
giá trị 0 sẽ sinh ra một ngắt thời gian sau
đó được nạp lại giá trị lấy
từ thanh ghi lưu trữ. Mặc dù tần số
của bộ dao động tinh thể thạch anh khá
ổn định, nó không thể đảm bảo các tinh
thể trong các máy tính khác nhau đều chạy chính xác cùng
tần số.
Mỗi thành viên của hệ thống
phân tán lại có đồng hồ đo thời gian riêng, sự
tồn tại nhiều đồng hồ vật lý như vậy
sẽ phát sinh vấn đề đồng bộ với
thời gian thực và thời gian giữa các thành viên
với nhau. Thực tế khi một hệ thống có
nhiều máy tính thì tất cả các tinh thể sẽ
chạy với tần số khác nhau chút ít, dần gây ra
sự mất đồng bộ và giá trị đọc ra
sẽ khác nhau. Sự khác nhau về giá trị thời gian
được gọi là sự sai lệch của
đồng hồ và kết quả sẽ dẫn
đến những sai lệch trong những tính toán có liên
quan tới thời gian thực. Đồng hồ vật
lý của các thiết bị cần phải được
đồng bộ với thời gian chuẩn, nếu các
máy tính có các bộ thu thời gian và có thể liên lạc
được máy chủ thời gian quốc tế thì
việc nên thực hiện đồng bộ theo thời
gian quốc tế, nếu không thể liên lạc
được thì sử dụng các biện pháp tốt
nhất có thể để đảm bảo sai lệch
thời gian giữa các thành viên thấp nhất.
Bốn giải thuật phổ biến
đang sử dụng hiện nay là: giải thuật
Cristian, giải thuật Berkeley, giải thuật trung bình và
giải thuật tham chiếu quảng bá. Tất cả các
giải thuật đều sử dụng nguyên lý cơ
bản, mỗi máy xem như có một bộ đếm
thời gian, nó tạo ra một ngắt H lần trong
một giây. Gọi giá trị của đồng hồ này
là C. Khi thời gian UTC là t, thì giá trị của đồng
hồ trên máy p sẽ là Cp(t). Trong một thế giới lí
tưởng chúng ta có Cp(t) = t cho tất cả p và t, nói cách
khác C(p)t lí tưởng bằng 1. Bộ định
thời thực không ngắt chính xác H lần trong một
giây. Về lý thuyết, bộ định thời với H
= 60 cần phát ra 216000 nhịp trong một giờ. Thực
tế những sai số tương đối đạt
được với các vi mạch đếm thời gian
hiện đại đạt khoảng 10-5,
nghĩa là một máy nào đó có thể lấy giá trị
từ 215998 đến 216002 nhịp trong một giờ.
Một cách chính xác hơn, tồn tại một hằng
số ρ thoả mãn 1 - ρ ≤ dC.dt ≤ 1 + ρ, hằng số ρ sẽ được nhà sản
xuất công bố và được gọi là tỉ lệ
dung sai tối đa.
Giải thuật này do Cristian đề
xuất vào năm 1989 và đã được áp dụng cho
đồng bộ thời gian máy khách với máy chủ
thời gian quốc tế bằng cách sử dụng giao thức đồng bộ
thời gian mạng (NTP). Khi máy khách gửi yêu cầu lên máy
chủ để lấy thời gian, thời gian trễ
trên đường truyền sẽ làm sai lệch giá
trị thời gian thực, bí quyết của giải
thuật chính là cách tính toán cho sự chậm trễ này. Giao
thức thời gian mạng NTP (Network Time Protocol) dùng
để đồng bộ đồng hồ của các
hệ thống máy tính thông qua mạng dữ liệu
chuyển mạch gói với độ trễ thay
đổi. Mỗi máy được cài đặt bộ
phận nhận thời gian từ máy chủ trên mạng,
nó giải quyết vấn
đề trễ thông tin lưu chuyển trên mạng
bằng cách tính toán tương đối độ lệch
thời gian theo giải thuật Cristian và độ chính xác
có thể đạt
dưới 50 ms.

Hình 4.2 Giải thuật
Cristian
Sử dụng giao
thức NTP, tại thời điểm T1 máy khách
gửi A yêu cầu và nhận được kết
quả trả về từ máy chủ B tại thời
điểm T4. Thời gian máy chủ nhận
được là T2 và thời gian trả về
kết quả là T3. Giả thiết độ
trễ mạng chiều gửi và chiều nhận xấp
xỉ bằng nhau, nghĩa là T2 - T1 ≈ T4
- T3, máy khách có thể ước tính độ
lệch thời gian với máy chủ là Ɵ = T3+
(T2 - T1 +T4 - T3)/2 - T4 =
(T2-T1+T3-T4)/2, thời gian
mới của máy khách sẽ phải cộng thêm giá trị
tính toán theo công thức trên. Nếu giá trị Ɵ < 0, nghĩa là đồng
hồ của máy khách chạy nhanh hơn thì cần phải
điều chỉnh lùi, nhưng thời gian không thể
quay lui, hành động này có thể dẫn đến
những hậu quả nghiêm trọng. Nếu trong
khoảng thời gian quay lui đến thời điểm
hiện hành không có sự kiện cập nhật nào thì có
thể thiết lập thời gian mới, nhưng nếu
có sự kiện đã xảy ra thì nên tạo vòng lặp
để điều chỉnh dần dần. Chu kỳ
điều chỉnh thường 10ms, nghĩa là cứ 10ms
trôi qua thì điều chỉnh thành 9ms cho đến khi
đạt được độ chính xác. Tương
tự như vậy đối với trường
hợp Ɵ > 0, nghĩa là đồng hồ của máy
khách chạy chậm hơn, do đó phải điều
chỉnh tiến nhưng cần kiểm tra xem trong
khoảng thời gian đó có nhiệm vụ theo lịch
hay không, nếu có thì phải tránh hiện tượng
bỏ sót, nghĩa là cứ 10 ms trôi qua thì điều
chỉnh thành 11ms cho đến khi đạt
được độ chính xác.
Khi giao thức NTP đã
được thiết lập giữa các máy, B cũng
thăm dò A cho thời gian hiện tại của nó,
độ trễ truyền thông ước chừng sẽ
bằng δ = ((T4-T1)
– (T3-T2))/2. Để chính xác hơn thì
cần thực hiện tám lần, tám cặp giá trị
(Ɵ, δ) được lưu
vào bộ đệm, cuối cùng lấy giá trị tối
thiểu cho δ làm độ
trễ ước lượng tốt nhất và sau đó
giá trị Ɵ tương tứng là độ lệch
thời gian đáng tin cậy nhất. Các máy chủ
thời gian NTP cũng cần phải được
đồng bộ, về nguyên tắc thì có thể áp
dụng NTP đối xứng, nghĩa là máy B cũng có
thể phải đồng bộ theo máy A, nhưng
điều này sẽ gây ra sự hỗn loạn.
Để giải quyết vấn đề này, các máy
chủ NTP được chia thành các tầng, những máy
chủ tham chiếu đến đồng hồ nguyên
tử được xếp vào tầng 1, nó chỉ
điều chỉnh đồng hồ khi mức tầng
của nó cao hơn máy chủ tham chiếu.
Giải thuật Cristian đòi hỏi phải có một
máy chủ cung cấp thời gian cho các thành viên trong hệ
thống, thời gian của mỗi thành viên sẽ hoàn toàn
phụ thuộc vào máy chủ này, như vậy có thể
nói máy chủ thời gian hoàn toàn thụ động trong quá
trình đồng bộ. Cách tiếp cận của giải
thuật Berkeley hoàn toàn ngược lại, một
tiến trình trên máy chủ luôn thăm dò các để tính
toán thời gian thời gian cần phải điều
chỉnh cho tất cả các thành viên trong nhóm. Giải thuật Berkeley thực hiện tính toán thời bằng
cách tham khảo thời gian của tất cả các thành
viên trong hệ thống, máy chủ thời gian chỉ
đóng vai trò như một thành viên điều phối, vì
vậy giải thuật này thích hợp cho hệ thống
không có khả năng đồng bộ với các máy chủ
thời gian quốc tế.
Hình 4.3 Giải thuật Berkeley
Máy chủ gửi
thời gian của mình cho các thành viên và yêu cầu từng
thành viên trả về độ lệch thời gian
giữa thành viên với máy chủ. Sau khi nhận
được kết quả từ các thành viên, máy chủ
tính trung bình của các giá trị trả về và coi đó
là thời gian cần điều chỉnh, máy chủ tính
toán độ lệch thời gian cho mỗi thành viên và
gửi yêu cầu để các thành viên cập nhật
lại thời gian. Thời gian ban đầu trên máy
chủ có thể được điều chỉnh
thủ công, thời gian sau khi đồng bộ có thể
khác với thời gian quốc tế, nhưng tất
cả các thành viên cùng đồng thuận với sự sai
lệch này, như vậy giải thuật chỉ
được áp dụng trong nội bộ.
Các thành viên trong hệ thống thống
nhất chu kỳ tái đồng bộ thời gian, khoảng
thời gian thứ i sẽ bắt đầu từ
thời điểm T0 + iR và chạy đến khi
T0 + (i+1)R, trong đó T0 là thời
điểm xác định trước và R là một
biến hệ thống. Bắt đầu mỗi chu
kỳ, tất các các thành viên quảng bá thời gian của
mình, sau đó bắt đầu nhận các bản tin
quảng bá từ các thành viên khác trong khoảng thởi gian
S. Cách đơn giản nhất để tính thời gian
mới là lấy trung bình của tất cả các giá
trị nhận được, hoặc có thể loại
bỏ m giá trị cao nhất và thấp nhất và lấy
thời gian trung bình của phần còn lại. Để
chính xác hơn có thể cộng thêm độ trễ
thời gian di chuyển trên mạng cho mỗi bản tin,
độ trễ này có thể ước lượng
bằng cách gửi thông điệp và đo thời gian
phản hồi.
Trong các mạng có dây, có thể dễ
dàng cài đặt các máy chủ thời gian và thực
hiện truyền thông giữa các máy, do đó việc
truyền tải thông tin có thể thực hiện
tương đối dễ dàng. Mạng không dây,
đặc biệt là những mạng cảm biến,
sẽ không còn giữ được các ưu điểm
trên, mỗi nút là tài nguyên bị ràng buộc và việc
định tuyến qua nhiều điểm truy nhập
không dây dẫn tới chi phí cao, ngoài ra cần phải
tối ưu hóa giải thuật để tiết
kiệm năng lượng. Từ những vấn
đề trên, cần thiết phải thiết kế các
giải thuật đồng bộ khác cho các mạng không
dây.
Đồng bộ tham chiếu quảng
bá là giao thức đồng bộ thời gian cho các thành
viên của hệ thống phân tán trong mạng không dây, nguyên
lý vận hành khác hẳn với các giao thức đồng
bộ trong mạng có dây. Thứ nhất, nó không giả
thiết tính sàng của mỗi nút và cũng giống như
giải thuật Berkeley nó không hướng tới mục tiêu
đồng bộ theo thời gian quốc tế UTC mà
chỉ đồng bộ theo thời gian của các thành
viên nội bộ trong hệ thống. Thứ hai, các
giải thuật trước đây đều sử
dụng giao thức trao đổi thông tin hai chiều
để đồng bộ, nghĩa là bên gửi và bên
nhận đều tham gia vào quá trình đồng bộ,
giải thuật đồng bộ tham chiếu quảng bá
tách khỏi quan điểm này, nó loại bỏ thành viên
gửi và chỉ cho phép đồng bộ các thành viên
nhận.

Hình 4.4 Cách tính thời gian trễ
Trong tham đồng bộ tham chiếu
quảng bá, bên gửi quảng bá thông điệp tham
chiếu với mong muốn những thành viên nhận
được sẽ tự điều chỉnh
đồng hồ của mình. Điểm quan trọng là
ở chỗ trong mạng cảm biến, với giả
thiết không cần định tuyến qua nhiều
điểm truy nhập thì thời gian lan tỏa tín
hiệu đến các nút khác xấp xỉ là hằng
số. Độ trễ lưu chuyển thông tin trong
mạng không dây phụ thuộc nhiều yếu tố,
thông tin phải di chuyển qua bộ định tuyến
không dây với tốc độ không ổn định
và phụ thuộc nguồn
năng lượng cũng như khoảng cách vật lý.
Các thành viên sẽ không lường trước
được thời gian chờ để
được phục vụ và vì vậy một giải
pháp được đưa ra là loại bỏ thời
gian trễ chuẩn bị bản tin và thời gian chờ
đợi trên Card mạng. Thời gian lan truyền trong
trường hợp này được tính từ thời
điểm thông điệp rời khỏi card mạng
của bên gửi, như vậy hai nguyên nhân quan trọng
làm thay đổi thời gian truyền thông điệp
không còn đóng vai trò trong ước lượng trễ,
đó là thời gian chi phí cho xây dựng thông điệp và
thời gian chi phí cho việc truy nhập mạng.
Các giao thức đồng bộ
thời gian ví dụ như NTP, nhãn thời gian
được thêm vào thông điệp trước khi
chuyển đến card mạng. Hơn nữa, mạng
không dây dựa trên giao thức tương tranh và không
thể biết trước được thông
điệp sẽ phải chờ bao lâu để
được thực sự gửi đi, những
yếu tố không tự quyết sẽ bị loại
bỏ trong đồng bộ tham chiếu quảng bá,
vấn đề còn lại chỉ là thời gian phân phát
đến máy nhận nhưng nó nhỏ hơn đáng
kể so với thời gian truy nhập mạng. Ý
tưởng đồng bộ tham chiếu quảng bá
rất đơn giản, khi một nút quảng bá thông
điệp tham chiếu m, mỗi nút P nhận
được thông điệp m sẽ ghi nhận thời
gian Tp,m, đó là thời gian cục bộ của P.
Bỏ qua độ lệch thời gian, hai nút P và Q có
thể trao đổi với nhau thời gian phân phát
để ước lượng độ lệch
tương đối với nhau:

trong đó M là tổng số thông
điệp tham chiếu đã gửi. Thông tin này quan
trọng, nút P sẽ biết giá trị đồng hồ
của Q tương ứng với giá trị của nó.
Ngoài ra, nếu chỉ đơn giản lưu trữ các
độ lệch này thì không cần điều chỉnh
đồng hồ của mình, đáng tiếc các
đồng hồ có thể trôi dạt khác nhau, kết
quả là việc tính toán đơn giản đổ
lệch trung bình như đã thực hiện trên không còn phù
hợp nữa, các giá trị cuối cùng được
gửi đơn giản sẽ kém chính các hơn các giá
trị đầu tiên. Hơn nữa, cùng với thời
gian qua đi, độ lệch cũng sẽ tăng lên.
Elson đã sử dụng giải thuật đơn
giản để cân bằng điều này, thay vì việc
tính toán trung bình thì áp dụng hồi quy tuyến tính tiêu chuẩn
để tính độ lệch Offset[p,q](t)=αt+β, trong
đó các hằng số α và β được tính từ cặp (Tp,k,
Tq,k), công thức mới sẽ cho phép nút P tính toán
chính xác hơn nhiều đồng hồ hiện hành
của Q và ngược lại. Các máy tính trong mạng không
dây liên lạc với nhau theo hình thức quảng bá, vì
vậy việc sử dụng giải thuật trung bình
sẽ là giải pháp thích hợp hơn trong môi
trường này.
Cho đến nay, chúng ta đã giả
thiết việc đồng bộ hóa đồng hồ
liên quan một cách tự nhiên với thời gian thực, trong
nhiều trường hợp các tiến trình có thể
đồng thuận về thời điểm hiện
tại mà không cần phải sử dụng thời gian
thực. Ví dụ khi biên dịch tập tin, các bên chỉ
cần nhận biết tập tin input.obj đã lỗi thời và
tập tin input.c là phiên
bản mới. Điều quan trọng trong trường
hợp này là phải có cơ chế theo dõi các sự
kiện của nhau, chỉ cần xác định sự
kiện nào xảy ra trước mà không cần quan tâm
đến thời gian vật lý. Nếu hai tiến trình
không tương tác với nhau thì có đồng bộ
thời gian hay không cũng không ảnh hưởng
đến hoạt động của chúng, hơn nữa
dù cho sử dụng thuật toán nào thì vẫn có sự khác
biệt thời gian vật lý giữa các tiến trình.
Lamport là người đầu tiên đã đưa ra khái
niệm đồng hồ logic, đó là cơ chế ghi
nhận các sự kiện xảy ra và các tiến trình
chỉ cần quan tâm đến thứ tự của các
sự kiện đó.
Để
đồng bộ đồng hồ logic, Lamport dựa trên
quan điểm nhân quả và đưa ra định
nghĩa mối quan hệ gọi được gọi là xảy
ra trước. Sự kiện a xảy ra trước
sự kiện b, ký hiệu là
a→b, được gọi là đúng nếu:
-
Nếu a và b
là hai sự kiện xảy ra trong cùng một tiến trình
và a xảy ra trước b.
-
Nếu a và b
không thuộc cùng một tiến trình nhưng a là sự
kiện gửi một thông điệp đi và b là sự
kiện nhận thông điệp đó.
Quan hệ xảy
ra trước có tính chất bắc cầu, nếu a→b
và b→c thì ta sẽ có a→c. Nếu hai sự kiện x
và y xảy ra trong hai tiến trình khác nhau mà không xác định
được mối tương quan giữa chúng thì không
thể nói x→y hay y→x, trường hợp này ta nói x
và y là những sự kiện tương tranh vì chúng hoàn
toàn có thể xảy ra đồng thời với nhau. Ký hiệu
C(x) là nhãn thời gian của x, những mệnh đề
sau là đúng:
-
Trong cùng
một tiến trình, nếu a xảy ra trước b thì
C(a) < C(b).
-
Nếu a và b
biểu diễn sự kiện gửi và nhận cùng
một thông điệp thì C(a) < C(b), sự kiện
nhận phải xảy ra sau sự kiện gửi vì
cần một khoảng thời gian nhất định
để lưu chuyển trên mạng.
-
Mọi
sự kiện phân biệt a và b thì C(a) ≠ C(b).
Để đo
thời gian tương ứng với một sự kiện
thì ta gán một giá trị cho bộ đếm C cho sự
kiện đó, các giá trị này phải đảm bảo nếu
a→b thì C(a) < C(b). Bộ
đếm C chỉ có thể tiến chứ không
được lùi, nghĩa là nếu cần điều
chỉnh thì chỉ được phép cộng thêm giá
trị số dương.

Hình 4.5 Đồng bộ
nhãn thời gian Lamport
Giả
sử có ba tiến trình P1, P2 và P3,
mỗi tiến trình đều có bộ đếm thời
gian riêng nhưng nhịp đếm không giống nhau, ban
đầu giá trị đồng hồ trên mỗi tiến
trình đều bằng 0. Cùng khoảng thời gian vật
lý, tiến tình P1 chỉ đếm được
6 nhịp trong khi đó tiến trình P2 đếm
được 8 nhịp và tiến trình P3 đếm
được 10 nhịp. Tại nhãn 6, tiến trình P1gửi
thông điệp m1 cho tiến trình P2, mất
bao lâu để thông điệp này đến đích tùy
thuộc vào việc lựa chọn đồng hồ nào, cụ
thể trường hợp này P2 ghi nhận tại
nhãn 16 và nó hiểu rằng thời gian di chuyển thông
điệp hết 10 đơn vị. Tương tự
như vậy, thời gian di chuyển của thông điệp
m2 là 16 đơn vị, cả hai giá trị này
đều là những số dương cho nên có thể chấp
nhận được.
Xét
thông điệp m3, thời điểm rời khỏi
tiến trình P3 là 60 và đến đích là 56,
như vậy tiến tình P2 nhận thấy thời
gian lưu chuyển là -4, đây là giá trị không thể chấp
nhận được và cần phải có biện pháp
ngăn chặn hiện tượng này. Giải pháp của
Lamport suy luận trực tiếp từ quan hệ xảy
ra trước, vì m3 rời đi tại thời
điểm 60 thì thời điểm đến nhanh nhất
phải là 61. Nếu giá trị nhãn thời gian tại
điểm nhận nhỏ hơn hoặc bằng nhãn thời
gian bên gửi thì bên nhận sẽ cộng thêm một
đơn vị vào nhãn thời gian gửi, như vậy
tiến trình P2 phải điều chỉnh từ
56 thành 61. Sau 8 đơn vị thời gian, thông điệp
m4 rời khỏi P2, như vậy thời
điểm gửi đi sẽ là 69 và đến đích tại
thời điểm 54, do đó P1 sẽ phải
điều chỉnh đồng hồ thành giá trị 70.

Trong
phần mở đầu chúng ta đã nói về vai trò của
tầng trung gian, tất cả những thao tác đồng
bộ đồng hồ logic đều được thực
hiện ở tầng này. Giải thuật gán nhãn thời
gian Lamport sẽ được thực hiện như sau:
1.
Mỗi tiến trình Pi có bộ đếm Ci để đánh dấu thời điểm xảy tra
các sự kiện trong tiến trình, sự kiện ở
đây có thể là nội tại trong tiến trình hoặc
gửi thông điệp cho tiến trình khác.
2.
Trước khi thực hiện một
sự kiện, tiến trình Pi tăng bộ đếm thêm 1
đơn vị, nghĩa là Ci
← Ci + 1.
3.
Khi tiến trình Pi gửi thông điệp
m cho tiến trình Pj, nó
gửi kèm nhãn thời gian của thông điệp ts (m)
=Ci .
4.
Nhận được thông điệp m,
tiến trình Pj điều chỉnh bộ
đếm Cj ← max{Cj , ts (m)}, sau
đó mới chuyển lên tầng ứng dụng.
Trong
một số trường hợp, cần phải bổ
sung thêm định danh của tiến trình để đảm
bảo không xảy ra hiện tượng hai sự kiện
có nhãn thời gian giống nhau. Ký hiệu (Ci, i) sẽ được hiểu là sự
kiện xảy ra tại thời điểm Ci trên tiến trình Pi. Cho hai nhãn thời gian (Ci, i) và (Cj, j), nếu Ci = Cj và i<j thì (Ci, i) < (Cj, j).
Nhãn
thời gian Lamport được áp dụng cho truyền
thông hàng đợi, ví dụ về trường hợp cập
nhật dữ liệu nhân bản, thứ tự cập nhật
các bản sao phải được thực hiện rất
nghiêm ngặt. Giả sử tài khoản của khách hàng có
1000 đồng, tại một thời điểm khách hàng
gửi thêm 100 đồng và ngân hàng cũng tính lãi suất
1% cho tài khoản này, hai lệnh trên được gửi
đến các bản sao nhân bản để cập nhật.
Do độ trễ trên mạng nên hai lệnh cập nhật
đến các bản sao theo thứ tự khác nhau, lệnh
gửi thêm tiền được thực hiện trước
trên bản sao thứ nhất thì số dư tài khoản sẽ
là 1111 VND, còn trên bản sao thứ hai lệnh tính lãi suất
được thực hiện trước thì số
dư tài khoản của sẽ là 1110 VND. Vấn đề
ở đây là các thao tác cập nhật phải được
thực hiện theo cùng một thứ tự trên tất cả
các bản sao thì mới có thể đạt được
tính nhất quán, dù cho giá trị có thể khác nhau phụ thuộc
vào việc lệnh nào được thực hiện
trước. Những trường hợp như vậy
đòi hỏi phải đảm bảo truyền thông theo
nhóm có thứ tự, cách đơn giản là gán nhãn thời
gian Lamport cho mỗi câu lệnh cập nhật trước
khi gửi đến các bản sao, tầng trung gian trên mỗi
bản sao có nhiệm vụ sắp xếp lại theo thứ
tự đã phân phát trước khi gửi cho ứng dụng
xử lý.

Qui
trình truyền thông nhóm theo thứ tự toàn bộ được
thực hiện bằng cách mỗi thông điệp
được gán nhãn thời gian Lamport của bên gửi,
giả sử không bị mất thông điệp nào. Tiến
trình nhận sẽ đưa các thông điệp vào hàng
đợi cục bộ và sắp xếp theo nhãn thời
gian đính kèm sau đó sẽ gửi thông điệp xác nhận
đến tất cả các tiến trình khác, tất nhiên
thông điêp xác nhận cũng được gán nhãn thời
gian Lamport và giá trị của nó luôn lớn hơn nhãn thời
gian trong thông điệp nhận được, như vậy
tất cả các tiến trình cuối cùng sẽ có cùng một
bản sao của hàng đợi cục bộ. Tiến
trình nhận có thể gửi thông điệp ở đầu
hàng đợi đến ứng dụng xử lý khi và chỉ
khi nó đã được tất cả các tiến trình
khác xác nhận, sau khi chuyển qua ứng dụng thì có thể
xóa thông điệp đó khỏi hàng đợi, như vậy
đã đạt được tính nhất quán theo thứ
tự. Truyền thông nhóm theo thứ tự toàn bộ là giải
pháp quan trọng cho các dịch vụ nhân bản, các bản
sao đạt được tính nhất quán bằng cách thực
hiện các thao tác giống nhau theo cùng một thứ tự
ở mọi nơi. Các bản sao tuân thủ qui tắc chuyển
đổi giống nhau trong cùng một máy trạng thái hữu
hạn nên nó còn được gọi là nhân bản máy trạng
thái.
Đồng hồ
Lamport mới chỉ đề cập đến kết quả
mà chưa nói đến nguyên nhân, nếu sự kiện a xảy
ra trước sự kiện b thì nhãn thời gian xảy ra
sự kiện a phải nhỏ hơn nhãn thời gian xảy
ra sự kiện b, nghĩa là C (a) <C (b). Sẽ chưa thể
có kết luận về mối liên hệ giữa hai sự
kiện nếu biết nhãn thời gian của chúng, tức
là nếu C (a) <C (b) và chúng đều là hai sự kiện
trong một tiến trình hoặc của cùng một thông
điệp thì có thể khẳng định a→b,
ngược lại thì không thể khẳng định sự
kiện nào xảy ra trước. Ký hiệu Tsnd(mi) là nhãn thời gian gửi thông
điệp mi và Trcv(mi) là nhãn thời
gian nhận được thông điệp đó, hiển
nhiên ta có Tsnd(mi) < Trcv(mi) bởi vì chúng
đều là các sự kiện liên quan tới thông
điệp mi. Nếu Tsnd(mi)
< Trcv(mj) thì không thể có kết luận gì về
tính nhân quả giữa hai thông điệp mi và mj, ví dụ trên hình vẽ, không
thể khẳng định m0 hay m1
được gửi trước.

Vấn đề nằm ở chỗ
đồng hồ Lamport không nắm bắt được
quan hệ nhân quả, điều này có thể khắc
phục bằng cách sử dụng đồng hồ vector.
Trong một số trường hợp, áp dụng đồng
hồ vector có thể đưa ra kết luận về
tính nhân quả của hai sự kiện trên, do đó
người ta nói đồng hồ vector là nhân quả hóa
các sự kiện phi nhân quả. Để theo dõi quan
hệ nhân quả thì chỉ cần gán cho mỗi sự
kiện một tên duy nhất, chẳng hạn tổ
hợp định danh tăng tuần tự của các
tiến trình, ký hiệu pk là sự kiện thứ
k trong tiến trình P. Vấn đề nhân quả sẽ
được giải quyết bằng việc theo dõi
lịch sử hoạt động, đó là những sự
kiện được ghi lại trong bộ nhớ ổn
định khi thực hiện các thao tác trên mỗi
tiến trình.
Nếu sử dụng một chỉ
mục cho mỗi tiến trình thì có thể biểu diễn
lịch sử nhân quả dưới dạng vector, số
lượng phần tử của vector bằng số
lượng tiến trình và mỗi phần tử
tương ứng với một tiến trình. Vector nhãn
thời gian được xây dựng bằng cách
để mỗi tiến trình Pi duy trì một vector
Vi với hai tính chất sau:
-
Vi[i]
là số sự kiện đã xảy ra cho đến
thời điểm hiện tại trên tiến trình Pi.
-
Nếu Vi[j]
= k thì Pi hiểu rằng k sự kiện đã
xảy ra ở Pi.
Tính chất đầu tiên
được duy trì bởi việc tăng Vi[i]
đồng thời với mỗi sự kiện mới
xảy ra ở Pi, tính chất thứ hai
được duy trì bằng các vector nhãn thời gian cùng
với các thông điệp được gửi. Mỗi
khi có sự kiện mới xảy ra ở tiến trình Pi
thì phải tăng VCi[i] và phải đảm bảo vector
này được gửi cùng thông điệp suốt trong
quá trình. Giải thuật gán nhãn thời gian vector phát
biểu như sau:
-
Mỗi tiến trình Pi duy trì n-vector Vi, ban đầu
tất cả các phần tử đều bằng 0.
-
Mục j trong Vi là ước
chừng số bước thực hiện trong tiến
trình Pi
-
Tại mỗi bước, giá trị Vi[i] được tăng thêm 1: Vi [ i ] ← Vi [i]+1.
-
Khi tiến
trình Pi gửi thông điệp m cho Pj, nó đặt nhãn thời gian vector
ts(m)=Vi [i].
-
Sau khi nhận
thông điệp, tiến trình Pj cập nhật Vj [j ] ← max{Vj [j], ts (m)[j]}
-
Nếu a là sự
kiện trong tiến trình Pi thì gán V(a) là giá trị của Vi tại cuối sự kiện a.
Giá trị ts(m)[i] biểu thị ts(m)[i]-1
sự kiện đã xảy ra trên tiến trình Pi
trước khi gửi thông điệp, như vậy
tiến trình Pj biết được số
lượng sự kiện xảy ra không những trên
tiến trình Pi mà còn cả trên các tiến trình khác. Nói
cách khác, nhãn thời gian ts(m) thể hiện số
lượng sự kiện trong tất cả các tiến
trình xảy ra trước khi gửi thông điệp m và m
có thể phụ thuộc vào nhân quả đó.

Hình 4.6 Cập nhật nhãn thời gian
vector
Giả sử có ba
tiến trình P0, P1 và P2, trong mỗi
tiến trình sẽ xây dựng một vector gồm ba
phần tử, mỗi phần tử tương ứng
với nhãn thời gian của một tiến trình, ban
đầu giá trị của tất cả các phần
tử đều bằng 0.
Tiến trình P0 gửi thông điệp cho
tiến trình P1 tại thời điểm giá
trị vector của nó là (1,0,0), nhận được thông
điệp tiến trình P1 sẽ cập nhật
vector thời gian của nó thành (1,2,0), quá trình tương
tự như vậy cũng được thực
hiện cho các sự kiện khác của cả ba tiến
trình. Nhắc lại kiến thức về so sánh vector, cho
hai vector V và W, chỉ có thể so sánh nếu số
lượng phần tử của chúng bằng nhau, khi
đó các mệnh đề sau là đúng:
•
Ngang
bằng: V = W nếu với
mọi i, V[i] = W[i], ví dụ: (3,2,4) = (3,2,4)
•
Nhỏ
hơn hoặc bằng: V
≤ W nếu với mọi i, V[i] ≤ W[i], ví dụ:
(2,2,3) ≤ (3,2,4), (3,2,4) ≤ (3,2,4)
•
Nhỏ
hơn: V < W nếu V
≤ W nhưng V ≠ W, ví
dụ: (2,2,3) < (3,2,4)
•
Không
thể so sánh: V || W nếu !(V≤ W) và !(W ≤ V), ví
dụ: (3,2,4) || (4,1,4)
Sử dụng đồng
hồ vector, giờ đây có thể đảm bảo tính
nhân quả trong truyền thông, nghĩa là một thông
điệp được gửi đi khi và chỉ khi
đã nhận được tất cả các thông
điệp trước nó, thậm chí đó là những
thông điệp được gửi từ bất
kỳ tiến trình nào vào bất kỳ thời gian nào. Tầng
trung gian trì hoãn việc chuyển thông điệp lên
tầng ứng dụng, sẽ lưu giữ thông
điệp trong một khoảng thời gian nhất
định để sắp xếp chúng theo thứ tự
nhân quả.

Ví dụ ba tiến
trình P0, P1 và P2 gửi thông
điệp theo nhóm, P0 gửi thông điệp
đến các thành viên khác, P1 nhận
được thông điệp sau đó gửi theo nhóm và
thông điệp này đến P2 sớm hơn thông
điệp được gửi từ P0. Thời
điểm P2 nhận được thông
điệp từ P1, nhãn thời gian của nó vẫn
là (0,0,0) trong khi nhãn thời gian của thông điệp do P1
gửi đến là ts(m)=(1,2,0), kiểm tra phần tử
thứ nhất của nhãn thời gian vector nó hiểu
rằng cần phải chờ thông điệp từ P0.
Nhận được thông điệp từ P0 với
nhãn thời gian ts(m)= (1,0,0) nó điều chỉnh nhãn
thời gian (1,0,1) lấy từ vùng đệm thông
điệp từ P1 gửi đến để
xử lý, nhãn thời gian được gán sẽ là (1,2,2).
Phần mềm trung gian sắp xếp các thông điệp
theo thứ tự nhân quả chỉ dựa thuần tùy vào
nhãn thời gian đính kèm, cách tiếp cận này có một
số hạn chế nhất định dẫn
đến các vấn đề về hiệu năng.
Tại một thời
điểm bất kỳ, trạng thái toàn cục của
một hệ thống phân tán được đặc
trưng bởi trạng thái của từng tiến trình và
các thông điệp đang lưu chuyển trong hệ
thống. Một trong những phương pháp để
xác định trạng thái toàn cục là sử dụng lát
cắt, lát cắt mô tả sự kiện cuối cùng mà
sự kiện này được ghi lại cho mỗi
tiến trình, bằng cách này nó có thể kiểm tra lại
rằng tất cả các thông điệp nhận
đều tương ứng với các thông điệp
gửi được ghi lại trên đường
cắt.
Nếu có đồng hồ được đồng
bộ tuyệt đối, một giải pháp được
đưa ra là mỗi tiến trình pi ghi
nhận trạng thái xi tại thời điểm
tương lai t nào đó sẽ gửi xi(t)
đến tất cả các tiến trình khác. Vấn đề nằm ở chỗ
giải pháp
trên không ghi nhận trạng thái của các kênh truyền và
đồng thời bị sai lệch bởi trễ
đường truyền, do đó đồng bộ
tuyệt đối là không thể được. Vì
vậy cần phải nới lỏng điều kiện, thay cho khái niệm
trạng thái toàn cục của hệ thống sẽ
đưa ra trạng thái toàn cục nhất quán.

Hình 4.7 Lát cắt trong
hệ thống phân tán
Cho tiến trình Pi , trong đó xuất hiện các sự kiện
ei0, ei1, … ta có một số khái
niệm sau:
Lịch
sử tiến trình (Pi) = hi = <ei0, ei1, … >
Tiền
sử tiến trình (Pik) = hik = <ei0, ei1, …,eik >
Trạng thái tiến trình Sik : là trạng thái của Pi ngay trước
khi sự kiện thứ k.

Hình 4.8 Các loại lát cắt
Lát cắt mô tả sự kiện cuối
cùng mà sự kiện này được ghi lại cho mỗi
tiến trình. Cho tập các tiến trình P1 , …,Pi , …. :
Lịch
sử toàn cục: H = Èi (hi)
Trạng
thái toàn cục: S = Èi (Siki)
Lát cắt C Í H = h1c1 È h2c2 È … È hncn
Ranh giới của C = {eici, i = 1,2, … n}
Lát cắt
C là nhất quán khi và chỉ
khi với "e Î C, nếu tồn tại
quan hệ nhân quả f ® e thì f Î C. Lát cắt là nhất
quán mạnh khi và chỉ khi mọi quan hệ nhân quả f ® e ta có f ,e Î C, nghĩa là sự kiện gửi và
nhận đều thuộc về lát cắt. Các trường
hợp khác gọi là lát cắt không nhất quán, trạng
thái toàn cục S là nhất quán khi và chỉ khi nó
tương ứng với lát cắt nhất quán.
Một trong
những vấn đề cơ bản của các hệ
thống phân tán là sự tương tranh và sự phối
hợp giữa các tiến trình. Có thể xảy ra
trường hợp cùng một lúc nhiều tiến trình
cùng truy nhập đến một tài nguyên dẫn
đến sự xung đột hoặc một thao tác nào
đó không được thực thi trọn vẹn.
Để giải quyết vấn đề này, một
số giải thuật loại trừ tương hỗ
đã được đề xuất dựa trên phương
pháp sử dụng thẻ bài và cấp quyền truy nhập.
Bản
chất của phương pháp thẻ bài là duy trì một
thông điệp duy nhất gọi là thẻ bài di chuyển
trong một nhóm các thành viên của hệ thống. Thành viên
nào nắm giữ thẻ bài thì có quyền truy nhập tài
nguyên, nếu không có nhu cầu
truy nhập tài nguyên thì sẽ chuyển cho thành viên
kế tiếp. Phương pháp này luôn bảo đảm
tránh được tương tranh vì tại một
thời điểm chỉ có tối đa một thành viên
nắm giữ thẻ bài, tuy nhiên nếu thẻ bài bị
mất thì không có thành viên nào được sử dụng
tài nguyên, hệ thống phải tái tạo một thẻ
bài mới. Phương pháp cấp quyền truy nhập
hoạt động theo hai bước, bước thứ
nhất gửi yêu cầu đề nghị
được cấp quyền sử dụng, sau khi
được cấp quyền mới chuyển sang
bước truy nhập tài nguyên.
Giả sử mỗi
tiến trình có một số định danh duy nhất và tiến
trình được bầu chọn làm điều phối
là tiến trình có số hiệu định danh cao nhất.
Khi một tiến trình nào đó cần vào vùng tới
hạn để truy nhập tài nguyên nó sẽ gửi
một thông điệp xin cấp quyền. Nếu không có
tiến trình nào đang trong vùng tới hạn thì tiến
trình điều phối sẽ gửi phản hồi cấp
phép, ngược lại sẽ gửi thông điệp
từ chối và chuyển yêu cầu này vào hàng đợi. Khi
tiến trình một tiến trình rời khỏi vùng tới
hạn nó sẽ gửi một thông điệp đến
tiến trình điều phối thông báo trả lại
quyền truy nhập, tiến trình điều phối
sẽ gửi quyền truy nhập cho tiến trình
đầu tiên trong hàng đợi truy nhập.

Hình 4.9 Giải thuật
tập trung
Giải thuật này
đảm bảo sẽ chỉ có tối đa một
tiến trình trong vùng tới hạn và chỉ cần 3 thông
điệp để thiết lập là: Yêu cầu, cấp
phép và giải phóng. Giải
thuật này cũng có hai nhược điểm có bản:
nếu tiến trình điều phối bị hỏng thì
sẽ không có một tiến trình nào được cấp
phép, hoặc khi một tiến trình đang trong vùng tới
hạn mà bị phong tỏa thì tài nguyên cũng không
được giải phóng. Ngoài ra khi qui mô hệ thống
ngày càng lớn, nếu chỉ có một tiến trình
điều phối thì sẽ xuất hiện hiện
tượng thắt cổ chai.
Giải
thuật tập trung chỉ có một thành phần điều
phối, đó là một cách tiếp cận nghèo nàn, các thành
viên chỉ có duy nhất một lựa chọn. Để
khắc phục nhược điểm này, mỗi tài nguyên sẽ
được nhân bản N lần và mỗi bản sao
sẽ có tiến trình điều phối riêng để
kiểm soát truy nhập. Một tiến trình muốn truy
nhập tài nguyên thì phải gửi yêu cầu đến N
tiến trình điều phối đang hoạt
động và sẽ được cấp quyền truy
nhập khi và chỉ khi nhận được số
phiếu đồng ý lớn hơn N/2. So
với giải thuật tập trung, giải thuật này ít
bị lỗi hơn, gọi p là xác xuất bị lỗi của
mỗi tiến trình điều phối, xác xuất k trong m
tiến trình điều phối bị lỗi sẽ là:

Khi một tiến trình muốn vào vùng
tới hạn, trước hết nó sẽ tạo ra
một nhãn thời gian và gắn vào thông điệp gửi
đến tất cả các tiến trình khác. Các tiến
trình khác sau khi nhận được thông điệp này
sẽ xảy ra ba tình huống:
-
Nếu không ở trong vùng tới hạn và
cũng không có nhu cầu vào vùng tới hạn thì nó sẽ
gửi thông điệp chấp nhận.
-
Nếu đang ở trong vùng tới
hạn thay vì trả lời nó sẽ đưa vào hàng
đợi, chờ đến khi thoát khỏi vùng tới
hạn sẽ phản hồi thông điệp chấp
nhận và xóa yêu cấu đó trong hàng đợi.
-
Nếu tiến trình cũng có nhu cầu vào
vùng tới hạn thì nó sẽ so sánh nhãn thời gian của
mình với nhãn thời gian gắn trong thông điệp nhận
được. Nếu nhãn thời gian của tiến trình
lớn hơn nhãn thời gian trong gán trong thông điệp
thì phải phản hồi bằng thông điệp chấp
nhận, ngược lại nếu nhãn thời gian của
tiến trình nhỏ hơn nhãn thời gian gắn trong thông
điệp nhận được thì nó chuyển yêu cầu
vào hàng đợi, chờ đến khi không có nhu cầu
vào vùng tới hạn thì sẽ lấy thông điệp
từ hàng đợi, phản hồi đồng ý cho các
tiến trình tương ứng và đồng thời xóa các thông
điệp này trong hàng đợi.
Hình 4.10 Giải thuật
phân tán
Giả thiết tất
cả các tiến trình được sắp xếp trên
một vòng tròn logic, các tiến trình đều
được đánh số và đều biết
đến các tiến trình cạnh nó. Khi hệ thống
bắt đầu khởi tạo, tiến trình 0 sẽ
được trao thẻ bài, thẻ bài này sẽ thể luân
chuyển quanh vòng tròn logic. Nó được chuyển
từ tiến trình k đến tiến trình kế tiếp
k+1 theo kiểu truyền thông điệp điểm – điểm.

Hình 4.11 Giải thuật
thẻ bài
Khi một tiến trình nhận
được thẻ bài từ tiến trình liền
trước, nó sẽ kiểm tra xem có cần thiết vào
vùng tới hạn hay không. Nếu không cần thiết thì
chuyển thẻ bài cho tiến trình kế tiếp,
ngược lại sẽ vào vùng tới hạn. Sau khi hoàn thành
phần việc của mình nó sẽ trả thẻ bài cho
tiến trình kế tiếp. Vấn đề lớn
nhất trong thuật toán truyền thẻ bài là thẻ bài
có thẻ bị mất, khi đó hệ thống sẽ
phải tạo lại thẻ bài bởi vì việc dò tìm
lại thẻ bài là rất khó.
Để so sánh các giải thuật
cần phải dựa trên số lượng thông
điệp cần lưu chuyển, độ trễ và
những vấn đề tiềm ẩn trong giải
thuật.
|
Giải thuật
|
Số lượng
thông điệp
|
Độ trễ
(SL thông điệp)
|
Nhược điểm
|
|
Tập trung
|
3
|
2
|
Tiến trình
điều phối lỗi
|
|
Phi tập trung
|
3mk, k=1,2..
|
2m
|
Kém hiệu quả
|
|
Phân tán
|
2(n -1)
|
2(n -1)
|
Lỗi của bất
kỳ tiến trình nào
|
|
Thẻ bài
|
1đến ∞
|
0 đến n -1
|
Mất thẻ bài
|
Giải thuật tập trung đơn
giản và hiệu quả nhất, nó chỉ cần ba thông
điệp để vào, ra và giải phóng khỏi vùng tới
hạn. Nếu mỗi tài nguyên được nhân bản m
lần thì giải thuật phi tập trung cần tới
3mk thông điệp, trong đó k=1,2,3.... tương ứng
với số lần gửi yêu cầu. Nếu hệ
thống gồm n thành viên thì giải thuật phân tán
cần 2(n -1) thông điệp, số lượng thông
điệp cần gửi trong giải thuật thẻ bài
luôn thay đổi.
Nhiều tác vụ trong
hệ thống phân tán yêu cầu phải tìm ra một
tiến trình bất kỳ để thực hiện vai trò
điều phối hay thực hiện vai trò đặc
biệt nào đó. Như vậy, cần thiết phải có
một giải thuật để tìm ra một tiến
trình duy nhất làm tiến trình điều phối hoặc
khi tiến trình điều phối gặp lỗi thì
sẽ phải có quá trình bầu chọn để tìm ra
một tiến trình khác thay thế, hai giải thuật
bầu chọn hay được sử dụng là giải
thuật nổi bọt (Bully) và giải thuật vòng.
Giả thiết mỗi
tiến trình đều có một định danh duy
nhất, tất cả các tiến trình khác đều có
thể biết được định danh và
địa chỉ của mỗi tiến trình trong hệ
thống, giả sử cần phải chọn một
tiến trình có định danh cao nhất. Tiến trình
bầu chọn sẽ được khởi
động sau khi xảy ra
lỗi hoặc tiến trình điều phối bị
lỗi. Giải thuật
gồm các bước sau:
-
Tiến trình
P gửi thông điệp bầu chọn (ELEC) đến
tất cả các tiến trình có định danh cao hơn.
-
Nhận
được thông điệp từ tiến trình P, các
tiến trình sẽ quyết định có tham gia bầu
chọn hay không, nếu không tham gia thì không cần trả
lời tiến trình P, nếu tham gia thì phải gửi thông
điệp không chấp nhận (NOT) cho tiến trình P và
đồng thời gửi thông điệp ELEC cho tất
cả các tiến trình khác có định danh cao hơn, quá
trình bầu chọn lại tiếp tục như tiến
trình P.
-
Sau một
khoảng thời gian chờ đợi, nếu không có
tiến trình nào phản hồi thì P sẽ trở thành
tiến trình được bầu chọn và nó gửi
thông điệp đến tất cả các tiến trình
khác thông báo kết quả bầu chọn.
Hình 4.12 Giải thuật bầu chọn
nổi bọt
Giả thiết các tiến trình có
một định danh duy nhất và được sắp
xếp trên một vòng tròn logic, mỗi tiến trình có
thể nhận biết được tiến trình kề
cạnh.

Hình 4.13 Bầu chọn bằng giải
thuật vòng
Các bước của giải thuật
bao gồm:
1. Một tiến trình bất kỳ
khởi sướng gửi thông điệp bầu
chọn đến các tiến trình đang hoạt
động gần nhất, quá trình gửi theo một
hướng nhất định.
2. Thăm dò liên tiếp trên vòng cho đến
khi tìm được một nút còn tồn tại.
3. Mỗi tiến trình sẽ gắn định
danh của mình vào thông điệp gửi.
4. Thông điệp sẽ đi qua tất
cả các tiến trình đang hoạt động và cuối
cùng sẽ trở về tiến trình khởi sướng,
khi đó sẽ chọn được một tiến trình
có định danh cao nhất và gửi thông điệp
đến tiến trình đã được chọn.
5. Tiến trình được chọn
sẽ gửi thông điệp đến tất cả các
tiến trình khác để thông báo kết quả bầu
chọn
Môi trường không dây thường
chịu ảnh hưởng của nhiều yếu tố
về môi trường dẫn đến độ tin
cậy truyền thông không cao. Các giải thuật bầu
chọn thường dựa trên giả thiết việc
phân phát các thông điệp tin cậy và hình trạng
mạng không thay đổi, đó là những yêu cầu khó
có thể đáp ứng được và như vậy
chỉ có một số rất ít các giải thuật có
thể áp dụng trong môi trường không dây. Năm 2004
Vasudevan đã đề xuất giải pháp, thay vì lựa
chọn ngẫu nhiên một cách chính xác như các giải
thuật bầu chọn truyền thống thì chỉ
cần chọn một thành viên tốt nhất. Ví dụ xét
một mạng không dây cơ bản, một nút nào đó
trong mạng sẽ khởi tạo bằng cách gửi thông
điệp bầu chọn đến tất cả
những nút láng giềng. Khi nhận được thông
điệp bầu chọn, mỗi nút sẽ đánh
dấu nút gửi là nút cha nếu đó là thông điệp
đầu tiên nhận được và tiếp tục
gửi thông điệp bầu chọn đến các nút
láng giềng khác ngoại trừ nút cha, nếu không nhận
nút gửi là cha thì phải gửi trả lời đã
nhận được thông điệp, khi đó nút
gửi thông điệp được coi là nút lá và gửi
về nút cha giá trị định danh của mình, như
vậy nút cha sẽ biết được giá trị
định danh của nhánh đó.

Hình 4.14 Bầu chọn
trong môi trường không dây
Ví dụ trên hình 4.14,
giả sử nút a khởi sướng quá trình bầu
chọn, nó sẽ gửi thông điệp bầu chọn
đến nút b và j. Hai nút này sẽ ghi nhận nút a là cha và
b sẽ tiếp tục gửi thông điệp bầu chọn đến nút c và
g nhưng chưa gửi thông tin xác nhận cho a, j sẽ
gửi đến g. Giả sử g nhận
được thông điệp bầu chọn từ b
trước và nó ghi nhận nút b là cha, sau đó mới
nhận được thông điệp bầu chọn
từ nút j, do đó nó không nhận j là cha nữa mà chỉ
gửi cho j thông tin xác nhận, j nhận được
bản tin này thấy g không nhận j làm cha nên gửi giá
trị của nó cho a, như vậy a coi giá trị
định danh lớn nhất của nhánh a qua j là j:4. Nút g
chuyển thông điệp bầu chọn cho nút h và e,
cả hai nút này đều chọn g là cha nên nút h chuyển
thông điệp bầu chọn đến nút i và nút e
chuyển thông điệp bầu chọn đến nút f.
Nút f nhận nút e là cha và
chuyển thông điệp đến nút i và d, tuy nhiên hai nút
này không nhận f là cha nên f sẽ thông báo định danh f:4
của nó cho e, các nút c và d cũng không nhận e là cha nên nút
e gửi về cho nút g giá trị f:4. Nút i nhận nút h là
cha, nó chuyển tiếp thông điệp đến nút f, tuy
nhiên nút f đã nhận nút e là cha nút i gửi cho nút h thông
điệp nhánh qua i có định danh cao nhất là i:5. Sau
khi nhận được kết quả từ nút i, nút h
gửi thông điệp cho nút g với định danh cao
nhất là h:8, nút g tổng hợp và gửi cho nút b thông báo
định danh cao nhất qua nhánh g là h:8. Quá trình tiếp tục như
vậy cho các nút khác, đường nét đậm đánh
dấu các nút cha, cuối cùng nút b nhận được
kết quả bầu chọn từ nhánh qua g có
định danh cao nhất là h:8 và nhánh qua c có định
danh cao nhất là c:3 nên nó sẽ gửi về cho a
định danh h:8 là cao nhất, như vậy nút a sẽ
tìm được nút h với giá trị cao nhất là h:8
xứng đáng làm nút được bầu chọn.
Các thuật toán bầu
chọn truyền thống thường chỉ áp dụng
cho các hệ thống qui mô nhỏ, hơn nữa các
thuật toán đó mới chỉ tập trung bầu chọn
một nút. Một số tình huống đòi hỏi bầu
chọn nhiều nút, ví dụ các nút đại diện
của các mạng ngang hàng. Các nút đại diện
cần phải đáp ứng các tiêu chí sau:
-
Thông tin gửi từ
các nút thường đến các nút đại diện có
độ trễ nhỏ
-
Các nút đại diện
nên phân bố đều trên mạng phủ
-
Nên xác định
trước số lượng các nút trong mạng phủ
-
Mỗi nút đại
diện không nên phục vụ vượt quá số lượng
đã qui định

Hình 4.15 Bầu chọn
trong hệ thống qui mô lớn
Rất may, các tiêu chí trên
hầu như dễ dàng thỏa mãn trong các mạng ngang
hàng. Giả sử cần chọn đại diện cho
hệ thống dựa trên bàng băm phân tán mà mỗi thành
viên được gán m-bit định danh, chọn
những định danh k-bit đại diện tính từ
bên trái thì chỉ cần thực hiện phép toán AND nhị
phân trong đó k bit bên trái có giá trị bằng 1 và các bit còn
lại có giá trị bằng 0. Ví dụ, k=3 và m=8 khi đó
chỉ cần lấy định danh và thực hiện
phép tính AND với 1110 0000 sẽ cho ra nút đại diện
của nhóm 8 thành viên.
Hệ thống định vị toàn
cầu GPS (NAVSTAR GPS - Navigation Satellite Timing and Ranging Global
Poritioning System) là một hệ thống các vệ tinh có
khả năng xác định vị trí trên toàn cầu
với độ chính xác khá cao do Bộ quốc phòng Mỹ
xây dựng từ những năm 1970. Ban đầu, GPS
được xây dựng để phục vụ cho các
mục đích quân sự, tuy nhiên sau này cho phép sử
dụng cả trong lĩnh vực dân sự. GPS bao gồm
một mạng lưới 29 vệ tinh, để có
khả năng hoạt động tốt thì số
lượng vệ tinh trong mạng lưới phải luôn
luôn lớn hơn 24. Để đảm bảo vùng
phủ sóng liên tục trên toàn thế giới, các vệ tinh
GPS được sắp xếp sao cho 4 vệ tinh sẽ
nằm cùng nhau trên 1 trong 6 mặt phẳng quỹ
đạo. Với cách sắp xếp này sẽ có 4
đến 10 vệ tinh được nhìn thấy tại
bất kỳ điểm nào trên trái đất với góc
ngẩng là 100 nhưng thực tế chỉ cần 4
vệ tinh là có thể cung cấp đầy đủ các
thông tin về vị trí. Các quỹ đạo vệ tinh GPS
là những đường vòng elip với độ lệch
tâm cực đại là 0.01, nghiêng khoảng 550 so với
đường xích đạo. Độ cao của các
vệ tinh so với bề mặt trái đất là
khoảng 20.200 km, chu kỳ quỹ đạo các vệ tinh
GPS khoảng 12 giờ, chính xác là 11 giờ 58 phút.
Khi số lượng các nút trong hệ
phân tán tăng lên thì nhiệm vụ duy trì thông tin của các
nút khác trở nên rất phức tạp. Trong các mạng
địa lý, mỗi nút được được
đặt tại một tọa độ địa lý
nhất định và có thể tính toán được
khoảng cách giữa các nút, nhưng khoảng cách càng xa thì
càng cần nhiều thời gian để lưu chuyển
thông điệp. Để giảm thiểu thời gian
truy nhập người ta thường nhân bản các máy
chủ dịch vụ, như vậy cần phải có các giải
thuật để tìm kiếm máy chủ gần nhất
đối với máy khách.
CHƯƠNG 5:
TIẾN TRÌNH
TRONG CÁC HỆ THỐNG PHÂN TÁN
Khái niệm tiến trình xuất phát
từ lĩnh vực hệ điều hành, một
chương trình đang chạy thì được gọi
là tiến trình. Một trong những nhiệm vụ chính
của hệ điều hành là quản lý và lập
lịch cho các tiến trình, tuy nhiên trong hệ thống phân
tán sẽ phát sinh nhiều vấn đề phức tạp
và quan trọng hơn rất nhiều. Tiến trình tạo
nên các khối chức năng trong hệ thống phân tán,
thực tế cho thấy việc phân chia như vậy
chưa đủ, cần thiết phải nhìn nhận
vấn đề một cách chi tiết hơn. Ví dụ,
trong hệ thống phân tán sẽ phải thường xuyên
áp dụng kỹ thuật đa luồng (multithread) nhằm
nâng cao hiệu suất hoạt động của hệ thống,
với kỹ thuật đó quá trình trao đổi thông tin
khách/chủ và các xử lý cục bộ được
thực hiện đồng thời với nhau.
Trong những năm gần đây, khái
niệm ảo hóa ngày càng trở nên phổ biến. Bằng
kỹ thuật ảo hóa, nhiều ứng dụng và
thậm chí nhiều hệ điều hành có thể
chạy song hành độc lập trên một nền
tảng phần cứng, điều này cho phép tận
dụng tối đa tài nguyên và đồng thời cách ly
được các lỗi phát sinh của mỗi tiến
trình hoặc các lỗi về bảo mật. Một
vấn đề quan trọng nữa là vấn đề
di chuyển các tiến trình giữa các máy khác nhau trong hệ
thống phân tán. Việc di chuyển tiến trình hay
đặc biệt hơn là việc di trú mã có thể giúp
đạt được qui mô hệ thống lớn
hơn nhưng cũng có thể đạt được
mục tiêu cấu hình động cho máy khách và máy chủ.
Theo quan điểm hệ điều
hành, việc quản lý và lập lịch cho các tiến trình
đóng vai trò quan trọng nhất. Trong hệ thống phân
tán, vấn đề trao đổi thông tin giữa các
tiến trình nảy sinh nhiều vấn đề khá
phức tạp, ngoài việc quản lý các tiến trình
cần phải đảm bảo hiệu suất hoạt
động của hệ thống. Mặc dù các tiến
trình hình thành nên các khối xây dựng hệ thống phân tán
nhưng thực tiễn cho thấy cần thiết
phải chia nhỏ tiến trình thành các đơn vị
nhỏ hơn để có thể dễ dàng hơn trong
việc xây dựng các ứng dụng phân tán và đồng
thời đạt được hiệu năng cao
hơn. Phần này sẽ giới thiệu vai trò của các
luồng trong hệ thống phân tán, chi tiết cách sử
dụng để xây dựng ứng dụng phân tán cần
xem thêm tài liệu Multithreaded Programming With threads của Bil Lewis.
Để hiểu về
vai trò của luồng trong hệ thống phân tán,
trước hết cần phải hiểu tiến trình là
gì và mối quan hệ của nó với các luồng. Mỗi
chương trình khi chạy cần phải được
cung cấp một bộ xử lý, như vậy để
đáp ứng yêu cầu cùng một lúc chạy
được nhiều chương trình thì hệ
điều hành phải tạo ra một số bộ
xử lý ảo cho mỗi chương trình. Nhằm mục
đích quản lý các bộ xử lý ảo này, hệ
điều hành tạo bảng tiến trình chứa thông tin
giá trị các thành ghi của đơn vị xử lý trung
tâm, bản đồ bộ nhớ, các tập tin đang
dùng, thông tin tài khoản và các quyền thực hiện có
liên quan…, do đó tiến trình có thể được
hiểu như là một chương trình đang chạy
trên bộ xử lý ảo. Nói cách khác, nhiều tiến trình
chạy đồng thời và dùng chung đơn vị
xử lý trung tâm cũng như các tài nguyên khác mà không làm
ảnh hưởng tới nhau, như vậy sẽ đảm
bảo tính trong suốt của hệ thống. Thường
thường, hệ điều hành sẽ yêu cầu
phần cứng hỗ trợ để thực hiện
việc tách biệt này.
Để đạt
được tính trong suốt, hệ điều hành
phải trả giá khá cao trong các thao tác xử lý, nó phải
tạo một không gian bộ nhớ riêng cho mỗi
tiến trình. Không gian đó được mô phỏng
như một hệ vi xử lý thực sự, phải có
các thanh ghi và vùng nhớ để lưu trữ dữ
liệu. Tại một thời điểm chỉ có duy nhất
một tiến trình được phép sử dụng tài
nguyên vật lý (CPU và vùng nhớ thực thi chương
trình), chi phí về thời gian xử lý sẽ phát sinh trong
di chuyển dữ liệu giữa bộ xử lý ảo và
bộ xử lý vật lý: Hệ điều hành phải sao
chép toàn bộ dữ liệu của tiến trình đang
chạy vào vùng nhớ đã qui định của tiến
trình đó, sau đó mới sao chép dữ liệu của
tiến trình kế tiếp vào bộ xử lý vật lý. Khi các tiến trình sử dụng
hết bộ nhớ chính, nó sẽ sử dụng một
phần ổ đĩa để làm bộ nhớ, như
vậy sẽ phát sinh rất nhiều các thao tác
đọc/ghi đĩa, điều này sẽ làm suy
giảm nghiêm trọng hiệu năng xử lý của
hệ thống. Giống như tiến trình, luồng
thực hiện đoạn mã chương trình của mình
độc lập với các luồng khác. Tuy nhiên,
điểm khác biệt cơ bản so với tiến
trình, luồng không cố đạt độ trong suốt
cao nếu thao tác đó làm suy giảm hiệu năng
hoạt động, do đó hệ thống luồng
thường chỉ duy trì thông tin tối thiểu nhằm
chia sẻ đơn vị xử lý trung tâm. Cụ thể,
vấn đề quản lý luồng được
thực hiện theo cơ chế đóng/mớ, tính toàn
vẹn của dữ liệu do người phát triển
phần mềm ứng dụng đảm nhiệm.
Trước
khi tìm hiểu vai trò của luồng trong các hệ thống
phân tán, chúng ta hãy thử xem xét nó trên một hệ thống
độc lập. Ví dụ trang bảng tính Excel: Các ô trong
bảng tính độc lập với nhau, nếu
người sử dụng thay đổi giá trị
của một ô thì sẽ làm thay đổi giá trị
của các ô có liên quan với ô dữ liệu đó. Nếu
chỉ sử dụng một luồng thì công việc tính
toán sẽ không được thực hiện trong khi
nhập dữ liệu và ngược lại khi đang tính
toán thì người dùng sẽ không nhập được
dữ liệu. Như vậy ở đây cần phải
có hai luồng xử lý: một luồng giao tiếp với
người sử dụng và một luồng khác cập
nhật thông tin của trang, thậm chí cần thiết phải
có luồng thứ ba thực hiện nhiệm vụ sao
lưu dữ liệu vào ổ đĩa. Một ví dụ
khác về ứng dụng đa luồng trong kỹ
thuật xử lý song song, trong các hệ thống nhiều
bộ vi xử lý, mỗi luồng được gán cho
một bộ xử lý nhưng vẫn dùng chung bộ
nhớ chính, kỹ thuật này thường
được cài đặt trên các ứng dụng máy
chủ trong mô hình khách/chủ.

Hình 5.1 Chuyển ngữ
cảnh giữa các tiến trình
Kỹ thuật xử lý
đa luồng cũng được áp dụng để
xây dựng những ứng dụng qui mô lớn, đó là
những ứng dụng bao gồm nhiều chương
trình cộng tác, mỗi chương trình sử dụng
một tiến trình riêng, tương tác giữa các
chương trình được thực hiện bằng
cơ chế truyền thông liên tiến trình (IPC) ví dụ như
kỹ thuật đường ống, hàng đợi thông
điệp hay vùng nhớ dùng chung. Nhược điểm
cơ bản của của cơ chế này là vấn đề
luân chuyển từ tiến trình này sang tiến trình khác. Hình
5.1 minh họa việc chuyển tiến trình, trước
tiên tiến trình phải chuyển từ không gian
người dùng sang không gian lõi, điều này sẽ làm
thay đổi bản đồ bộ nhớ trong khối
quản lý bộ nhớ MMU (Memory Management Unit) và xây dựng
lại vùng đệm chuyển đổi TLB (Translation Look-aside
Buffer), bên trong lõi sẽ xảy ra quá trình chuyển ngữ
cảnh xử lý và sau đó sẽ chuyển sang không gian
người dùng, quá trình này cũng đòi hỏi phải
thay đổi MMU và TLB. Thay cho kiến trúc tiến trình,
ứng dụng có thể được phân thành nhiều phần
khác nhau, mỗi phần sẽ tương ứng với
một luồng. Trao đổi thông tin giữa các luồng
này được thực hiện bằng việc chia
sẻ dữ liệu, việc chuyển đổi từ
luồng này sang luồng khác được thực
hiện trong không gian người dùng, rất ít khi sử
dụng đến cơ chế lập lịch trong không
gian lõi, vì vậy hiệu năng của hệ thống
sẽ tăng lên đáng kể.
Luồng thường
được cung cấp dưới dạng gói luồng,
những gói như vậy bao gồm các thao tác tạo và
hủy luồng giống như các thao tác trên biến
đồng bộ. Có hai cách tiếp cận cơ bản: tạo
thư viện luồng mức người dùng hoặc
mức lõi. Với cách tiếp cận thứ nhất,
luồng sẽ được thực hiện hoàn toàn trong
chế độ người dùng, như vậy các thao tác
tạo, hủy và chuyển luồng sẽ được
thực hiện tương đối dễ dàng với
chi phí khá thấp. Thao tác tạo luồng chỉ đơn
giản là việc định vị không gian bộ
nhớ, hủy luồng chỉ cần giải phóng vùng nhó
không còn sử dụng nữa. Chi phí thực hiện
chuyển luồng cũng không lớn, về cơ bản
chỉ cần vài chỉ thị lệnh chuyển dữ
liệu trong các thanh ghi của đơn vị xử lý trung
tâm mà không cần phải cập nhật lại bản
đồ bộ nhớ và vùng đệm TBL. Cách tiếp
cận này có điểm hạn chế là sử dụng phương pháp
gọi phong tỏa, khi một luồng đang thực
hiện thì tất cả các luồng khác trong tiến trình
đó sẽ phải tạm ngừng. Cách tiếp cận
thứ hai sẽ loại bỏ nhược điểm
trên, tất cả các thao tác tạo, hủy hoặc
chuyển luồng đều do mức lõi thực hiện,
điều này lại quay trở lại mô hình tiến
trình, như vậy sẽ mất đi những ưu
điểm của kỹ thuật xử lý đa luồng.

Hình 5.2 Kết hợp
tiến trình con và các luồng mức người dùng
Giải pháp ở đây
là phải kết hợp cả hai cách tiếp cận trên,
nghĩa là phải kết hợp luồng ở mức
người dùng và mức lõi, những luồng như
vậy gọi là tiến trình con LWP. Một tiến trình
chính sẽ bao gồm một số tiến trình hạng
nhẹ, thư viện luồng hoàn toàn nằm ở
mức người dùng, thao tác chuyển luồng
được thực hiện thông quan các biến
đồng bộ mà không cần sự can thiệp của
mức lõi. Các tiến trình con chia sẻ gói luồng và
mỗi tiến trình con sẽ chạy một luồng
của nó ở mức người dùng. Các ứng dụng
đa luồng được xây dựng bằng cách
tạo ra các luồng và sau đó gán cho mỗi tiến trình con,
công việc này thường được thực
hiện không tường minh và hoàn toàn trong suốt
đối với lập trình viên. Tổ hợp hoạt
động giữa gói luồng và các tiến trình con
được thực hiện như sau: Mỗi tiến
trình con sẽ tạo ra một ngăn xếp riêng chứa
các luồng sẽ được thực hiện, các
luồng được quản lý trong bảng luồng và
được bảo vệ bằng cơ chế biến
đồng bộ. Như vậy mỗi tiến trình con khi
gọi đến luồng nào đó chỉ cần tìm
kiếm trong bảng luồng và thực hiện việc
chuyển ngữ cảnh hoàn toàng trong chế độ
người dùng. Trường hợp một luồng nào
đó thực hiện lời gọi phong tỏa hệ
thống thì nó chuyển từ chế độ
người dùng sang chế độ lõi nhưng vẫn
nằm trong tiến trình con.
Một đặc tính
quan trọng của luồng là chúng cung cấp các phương tiện
dễ dàng cho phép gọi phong tỏa hệ thống
nhưng
không phong
tỏa
toàn bộ tiến trình đang chạy, do đó kỹ thuật
này thường được sử dụng trong các
hệ thống phân tán để duy trì truyền thông dưới
dạng các kênh logic. Ví dụ, trong mô hình khách/chủ, máy khách tạo
ra nhiều luồng chạy song song độc lập
với nhau, máy chủ cũng tạo ra nhiều luồng
để có thể đồng thời tiếp nhận và
xử lý các yêu cầu của máy khách.
Trên mạng diện
rộng, thông tin di chuyển từ máy tính này sang máy tính khác
sẽ mất một khoảng thời gian nhất
định, đôi khi cũng có thể lên tới vài giây.
Để đảm bảo tính trong suốt phân bố tài
nguyên thì các ứng dụng phân tán cần phải che
giấu thời gian lan truyền của các thông điệp.
Cách thông thường để che giấu độ
trễ truyền tin là khởi tạo kênh truyền sau
đó thực hiện một thao tác nào đó. Ví dụ, khi
duyệt một trang tin điện tử, trình duyệt
sử dụng giao thức HTTP để lấy dữ
liệu từ máy chủ về máy khách. Nếu hiển
thị thông tin cho người dùng sau khi đã tải toàn
bộ dữ liệu của trang thì thời gian chờ
đợi sẽ tương đối dài, để
giải quyết vấn đề này, sau khi lấy
được khung dữ liệu của toàn bộ trang,
máy khách sẽ tạo ra nhiều luồng riêng biệt,
mỗi luồng sẽ lấy dữ liệu một
phần của trang, nhận được dữ liệu
của phần nào thì hiển thị ngay thông tin của
phần đó. Như vậy, mỗi luồng trên máy khách
sẽ thiết lập một kết nối mới
gửi tới máy chủ, điều này làm tăng số
lượng yêu cầu lên máy chủ và khi số
lượng yêu cầu vượt quá khả năng xử
lý thì các yêu cầu này sẽ được đưa vào
hàng đợi chờ xử lý, như vậy hiệu
năng của hệ thống sẽ không được
cải thiện. Trong nhiều trường hợp, máy
chủ được tổ chức thành từng cụm, mỗi yêu
cầu của máy khách không phải chỉ xử lý trên
một máy chủ mà có thể sẽ được chuyển
đến máy khác xử lý, do đó đòi hỏi phải
triển khai kỹ thuật xử lý song song trên cả máy
khách lẫn máy chủ.
Kỹ thuật xử lý
đa luồng trên máy khách đóng vai trò rất quan trọng
nhưng thực tế cho thấy việc triển khai
kỹ thuật này trên máy chủ mới là nhân tố
quyết định hiệu năng của hệ thống
phân tán. Kỹ thuật xử lý đa luồng không
những đơn giản hóa đáng kể cách viết các
phần mềm mà còn làm cho việc triển khai kỹ
thuật xử lý song song để đạt
được hiệu năng cao nhất, dù cho đó là máy
tính một hay nhiều bộ vi xử lý. Ví dụ về
hệ thống cung cấp dịch vụ truyền tập
tin, tập tin được lưu trữ trên ổ
đĩa và quá trình đọc các khối dữ liệu
trên ổ đĩa chiếm thời gian đáng kể so
với các thao tác khác trong phiên làm việc. Bằng cách áp dụng kỹ
thuật xử lý đa luồng, máy chủ sẽ tạo
ra một luồng chuyên để tiếp nhận các yêu
cầu của máy khách và nhiều luồng khác có nhiệm
vụ đọc dữ liệu trên ổ đĩa. Khi
nhận yêu cầu đọc tập tin, thành phần
tiếp nhận yêu cầu sẽ quyết định giao
cho tiến trình đọc/ghi nào đó thực hiện sau
đó lại tiếp tục trở về trạng thái
sẵn sàng tiếp nhận các yêu cầu khác từ máy khách.
Nhận được yêu cầu đọc dữ
liệu, một luồng thực thi đọc/ghi sẽ
được khởi tạo bằng cách mở tập
tin và chờ cho đến khi hoàn thành quá trình đọc,
sau khi đọc xong sẽ
gửi kết quả về cho tiến thành phần
tiếp nhận để trả về cho máy khách. Nếu
chỉ sử dụng một luồng xử lý, vòng lặp
của chương trình chính sẽ tiếp nhận và hoàn
thành việc thực thi nhiệm vụ trước khi
tiếp nhận yêu cầu kế tiếp, như vậy
trong khi chờ đọc dữ liệu từ ổ
đĩa máy chủ tuy ở trạng thái nghỉ nhưng
vẫn không tiếp nhận thêm yêu cầu nào, kết
quả là nhiều yêu cầu của máy khách sẽ không được
xử lý. Như vậy có thể thấy việc áp
dụng kỹ thuật đa luồng đã làm tăng
đáng kể hiệu năng xử lý nhưng mỗi
luồng vẫn được lập trình theo
phương pháp thông thường.

Hình 5.3 Xử lý đa luồng trên máy chủ
Một giải pháp khác
chỉ áp dụng kỹ thuật đơn luồng
nhưng vẫn có khả năng cho hiệu năng cao
đó là phương pháp máy trạng thái hữu hạn. Khi có
một yêu câu gửi đến, một tiến trình duy
nhất sẽ kiểm tra xem dữ liệu trong bộ đệm
dữ liệu (cache) có đáp ứng yêu cầu hay không,
nếu đáp ứng được yêu cầu thì sẽ
trả về cho máy khách, nếu không đáp ứng sẽ
phải đọc từ ổ đĩa. Tuy nhiên thay vì
việc phong tỏa, nó thiết lập trạng thái của
yêu cầu và lưu vào bảng quản lý yêu cầu và
tiếp tục xử lý các thông điệp khác chuyển
đến. Nếu thông điệp mới chuyển
đến là yêu cầu từ phía máy khách thì sẽ tạo
một công việc mới, nếu đó là kết quả
yêu cầu đọc ổ đĩa từ thao tác
trước thì sẽ lấy lại thông tin của yêu
cầu tương ứng và trả về cho máy khách.
Với phương pháp này, máy chủ sẽ không cần
phải thực hiện các thao tác phong tỏa khi gửi và nhận thông
điệp và đồng thời loại bỏ
được đặc điểm xử lý tuần
tự của hai phương pháp trước, trạng thái
tính toán được lưu tường minh khi gửi
hoạc nhận mỗi thông điệp, tiến trình
vận hành như máy trạng thái hữu hạn, nó lấy
sự kiện và phản hồi tùy thuộc vào cái gì
chứa trong tiến trình đó.
|
Mô hình
|
Đặc điểm
|
|
Đa luống
|
Song song, phong tỏa hệ thống
|
|
Đơn luồng
|
Tuần tự, phong tỏa hệ
thống
|
|
Máy trạng thái
|
Song song, không phong tỏa hệ
thống
|
Tóm lại, trên máy chủ có thể áp
dụng ba kỹ thuật xử lý đa luồng,
đơn luồng hoặc máy trạng thái hữu hạn.
Kỹ thuật đa luồng cho phép xử lý song song
nhưng vẫn sử dụng phương pháp gọi phong
tỏa hệ thống. Kỹ thuật đơn luồng
không những phong tỏa hệ thống mà còn không hỗ
trợ xử lý song song, đôi khi sẽ làm giảm
hiệu năng của hệ thống. Kỹ thuật máy
trạng thái hữu hạn cho phép xử lý song song và không
phong tỏa hệ thống, tuy nhiên việc lập trình
sẽ phức tạp hơn rất nhiều.
Xử lý đa luồng và đa tiến
trình có thể được nhìn nhận như một cách
thực hiện nhiều công việc trong cùng một
thời điểm, làm cho hiệu năng của hệ
thống cao hơn. Nếu máy tính chỉ có một bộ vi
xử lý thì việc chạy đồng thời nhiều tiến
trình chỉ là ảo giác, bởi vì tại một thời
điểm bộ vi xử lý chỉ có thể thực thi
được một lệnh, bằng cách chuyển
rất nhanh từ tiến trình này sang tiến trình khác
hoặc từ luồng này sang luồng khác tạo ra
cảm giác các chúng chạy song song với nhau. Ý
tưởng ảo hóa xuất phát từ nhu cầu thực
tế, tài nguyên vật lý chỉ có một nhưng nhiều
thành phần cùng sử dụng chung tài nguyên và thành phần
nào cũng muốn tài nguyên đó thuộc về mình. Như
vậy sẽ nảy sinh vấn đề tương tranh
giữa các tiến trình, vì vậy kỹ thuật ảo hóa
đã được áp dụng vừa để đáp
ứng nhu cầu sở hữu riêng tài nguyên của các
tiến trình và đồng thời không để xảy ra
tranh chấp trong hệ thống.
Các hệ thống máy tính được
tổ chức theo mô hình phân tầng, tầng thấp
hơn sẽ cung cấp giao diện lập trình cho các
tầng mức cao hơn. Có nhiều loại giao diện,
thấp nhất là giao diện với bộ xử lý trung
tâm cho đến thư viện giao diện lập trình
ứng dụng do các hệ thống trung gian cung cấp.
Sự ảo hóa ở đây thể hiện bằng cách
mở rộng hoặc thay thế giao diện hiện hành
để bắt chước hành vi của hệ thống
khác.

Hình 5.4 Ảo hóa
trong hệ thống phân tán
Những năm 70 của thế kỷ
trước, giá thành của máy tính rất đắt mà
số lượng phần mềm chưa nhiều và các
hệ điều hành thường phát triển cho một
loại phần mềm nào đó. Ý tưởng ảo hóa
được IBM triển khai nhằm tiết kiệm chi
phí và cho phép các hệ thống phần mềm cũ có
thể chạy trên máy chủ thế hệ mới. Khi giá
thành phần cứng giảm dần, công nghệ phần
cứng thay đổi nhanh hơn các ứng dụng
phần mềm, vai trò ảo hóa chuyển dần sang
nhiệm vụ đảm bảo tính tương thích
với các hệ thống cũ. Đặc biệt,
với sự bùng nổ của mạng Internet, nhiều
hệ thống phần mềm lớn được xây
dựng trên các nền tảng hệ thống khác nhau,
việc ảo hóa nhằm tạo điều kiện cho các
hệ thống dễ dàng tương tác với nhau. Ảo
hóa sẽ giúp tăng cường tính khả chuyển và
tính linh hoạt của hệ thống, ví dụ hỗ
trợ cho việc nhân bản dữ liệu, góp phần
nâng cao tính trong suốt của hệ thống. Ảo hóa
giúp nâng cao tính năng bảo mật của hệ
thống, các thành phần bên ngoài không được phép
truy nhập trực tiếp vào các đối tượng
bên trong hệ thống. Ngoài ra, kỹ thuật ảo hóa có
thể hạn chế thậm chí loại bỏ các sự
cố tương tranh, điều này giúp cho hệ
thống hoạt động hiệu quả hơn.
Có nhiều cách để thực
hiện việc ảo hóa, để hiểu các hình
thức này trước hết cần phải phân biệt
bốn loại giao diện sau:
-
Giao diện
giữa phần cứng và phần mềm bao gồm các
chỉ thị lệnh mà
bất kỳ chương trình nào cũng có thể gọi.
-
Giao diện
giữa phần cứng và phần mềm bao gồm các
chỉ thị lệnh mà
chỉ một số chương trình có đặc
quyền mới được phép gọi, ví dụ hệ
điều hành.
-
Giao diện gồm
các lời gọi hệ thống do hệ điều hành
cung cấp
-
Giao diện
gồm các lời gọi thư viện hình thành trong thư
viện giao diện lập trình ứng dụng (API), trong
nhiều trường hợp các lời gọi hệ
thống ẩn trong thư viện này.

Hình 5.5 Ảo hóa bằng giao diện
lập trình ứng dụng
Bốn loại giao diện kể trên
được thể hiện trên hình 5.5 và đó là
những vấn đề cốt yếu của ảo hóa
để bắt chước hành vi của các giao diện.
Có thể cài đặt ảo hóa bằng hai hình thức, máy
ảo tiến trình và giám sát máy ảo. Hình thức thứ
nhất xây dựng hệ thống thực hiện thao thời
gian, về cơ bản cung cấp tập chỉ thị lệnh
trừu tượng dùng để thực thi phần
mềm ứng dụng, các chỉ thị lệnh này sẽ
được thông dịch trực tiếp, ví dụ môi
trường chạy Java hoặc cũng có thể
được mô phỏng như thực hiện các
ứng dụng Windows trên nền tảng hệ điều
hành Unix, hình thức ảo hóa này chủ yếu áp dụng
cho một tiến trình. Hình thức thứ hai dựa trên
kiến trúc phân tầng, nó che đậy hoàn toàn phần
cứng nhưng cung cấp đầy đủ các chỉ
thị lệnh của phần cứng gọi là giao
diện. Điểm quan trọng trong hình thức thứ
hai là giao diện của nó cung cấp đồng thời
cho nhiều chương trình khác nhau, điều đó
dẫn tới việc nhiều hệ điều hành có
thể cùng chạy trên một nền tảng phần
cứng.

Hình 5.6 Hai hình thức ảo hóa
Ví dụ, sử dụng phẩn mềm
máy ảo VMware thì có thể cài đặt đồng
thời nhiều hệ điều hành trên cùng một
nền tảng phần cứng. Như
vậy, hệ điều hành giao tiếp với phần
cứng qua lớp máy ảo, hình thức này ngày càng trở
nên quan trọng trong việc giải quyết vấn
đề tin cậy và bảo mật các hệ thống
phân tán. Giám sát máy ảo cho phép cách ly toàn bộ các ứng
dụng với môi trường của chúng, nếu xảy
ra lỗi do tấn công bảo mật thì không còn ảnh
hưởng đến toàn bộ máy. Ngoài ra, giám sát máy
ảo còn nâng cao tính khả chuyển của hệ
thống, nó tách biệt phần cứng với phần
mềm và như vậy có thể chuyển toàn bộ
phần mềm từ nền tảng phần cứng này
sang nền tảng phần cứng khác.
Nhiệm vụ chính của máy khách là cung
cấp giao diện cho người sử dụng
để tương tác với máy chủ, hình thức
thể hiện giao diện với người sử
dụng là một trong những vấn đề quan
trọng trong qui trình phát triển phần mềm. Ngoài ra,
tùy theo cách tổ chức xử lý, máy khách có thể
thực hiện nhiệm vụ tiền xử lý các dữ
liệu trước khi chuyển yêu cầu đến máy
chủ.
Hình 5.7 Giao thức tầng
ứng dụng
Nhìn chung, tương tác
giữa máy khách và máy chủ được thực
hiện theo hai cách. Cách thứ nhất, với mỗi
dịch vụ trên máy chủ sẽ có thành phần
tương ứng trên máy khách để có thể liên
lạc với dịch vụ qua mạng, như vậy
tầng ứng dụng trên máy khách sử dụng giao thức
riêng để đồng bộ dữ liệu trên máy
chủ. Đại diện cho hình thức này có thể
kể đến các ứng dụng điện thoại di
động và các ứng dụng dạng cửa sổ trên
máy tính, các ứng dụng này sẽ sao chép dữ liệu
của dịch vụ về máy khách để xử lý và
hiển thị theo cách riêng của máy khách, việc
đồng bộ dữ liệu của dịch vụ
với máy chủ được thực hiện theo cách
riêng của người phát triển ứng dụng.
Cách thứ hai, máy khách
không lưu trữ dữ liệu mà sử dụng giao
thức chung để lấy dữ liệu từ máy
chủ và hiển thị cho người sử dụng, như
vậy cả dữ liệu và các dạng hiển thị
cho người dùng đều được lưu
trữ trên máy chủ. Ví dụ thông tin của dịch
vụ được hiển thị trên các trình duyệt
của máy khách, máy khách chỉ đóng vai trò hiển thị
mà không có chức năng xử lý dữ liệu, cách
tiếp cận này ngày càng trở nên phổ biến trong môi
trường Internet.
Tiến trình trên máy khách
không những đảm nhiệm các chức năng giao tiếp
người dùng mà còn phải thực hiện nhiều
nhiệm vụ khác như xử lý dữ liệu, truy
nhập tài nguyên trên máy chủ..., những chức năng này
càng trong suốt đối với người dùng càng
tốt, trái ngược hẳn với quan điểm xây
dựng các ứng dụng trên máy chủ. Tính trong suốt
truy nhập được xử lý bằng cách tạo xây
dựng thành phần có giao diện như trên máy chủ
nhưng che giấu kiến trúc máy và hình thức trao
đổi thông tin. Vấn đề trong suốt phân
bố tài nguyên thường được xử lý
bằng hệ thống đặt tên, tuy nhiên trong những
trường hợp máy khách đã kết nối tới máy
chủ nào đó thì máy chủ có thể gửi thông tin di trú
đến tầng trung gian nằm cài đặt trên máy
khách để thực hiện kết nối đến
máy chủ mới, điều này có thể tạm thời làm
suy giảm hiệu năng của máy khách.

Hình 5.8 Tính trong suốt
truy nhập tài nguyên
Nếu máy chủ
được nhân bản, máy khách có thể gửi yêu
cầu đến tất cả máy chủ nhưng sẽ
chỉ nhận kết quá trả về từ 01 máy.
Để đảm bảo tính trong suốt về
lỗi, đối với lỗi truyền thông thì phần
mềm trung gian trên máy khách có thể gửi lại một
vài lần hoặc gửi yêu cầu đến máy chủ
khác xử lý, trường hợp xấu nhất có thể
lấy dữ liệu đã được phiên liền
trước ghi nhớ trong vùng đệm dữ liệu. Tính
trong suốt tương tranh thường được
giải quyết trên các máy chủ, ví dụ sử dụng
hệ thống giám sát tương tranh, máy khách ít khi
phải xử lý vấn đề này.
Máy chủ là máy chạy các tiến trình cung
cấp dịch vụ theo yêu cầu của máy khách, chúng thường
là những máy tính có cấu hình đủ lớn để
luôn sẵn sàng đáp ứng các yêu cầu dịch vụ
của các máy khách.
Thực chất, các máy chủ
đều được tổ chức theo cách giống
nhau, nó chờ yêu cầu từ máy khách gửi tới và
thực thi yêu cầu và sau đó lại chờ yêu cầu
tiếp theo. Có nhiều hình thức thiết kế hệ thống
máy chủ, có thể một máy chủ được
tổ chức đơn luồng, đa luồng, đa
tiến trình hoặc cụm máy chủ. Với một máy
chủ đơn luồng nó phải tiếp nhận yêu
cầu và xử lý sau đó trả về kết quả cho
máy khách và tiếp tục nhận yêu cầu mới. Máy
chủ đa luồng tiếp nhận yêu cầu nhưng
không xử lý mà chuyển yêu cầu đó cho luồng khác
hoặc cho một tiến trình khác để xử lý và sau
đó lại tiếp tục nhận các yêu cầu mới.
Hình 5.9 Cài đặt các
tiến trình theo mô hình khách/chủ
Đối với các
hệ thống tương tranh bắt buộc phải
thiết kế dưới dạng đa luồng hoặc
đa tiến trình. Một vấn đề quan trọng
cần phải giải quyết đó là làm thế nào máy
khách biết được điểm truy nhập
dịch vụ? Để giải quyết vấn
đề này người ta đã qui định trên
mối máy tính có 65636 cổng, các cổng từ 0-1024 là dành
cho những dịch vụ công cộng. Như vậy,
mỗi tiến trình cung cấp dịch vụ trên máy
chủ sẽ được gán cho
một cổng và máy chủ thường xuyên nghe
cổng đó. Máy khách muốn sử dụng dịch
vụ thì phải cung cấp cặp thông tin địa
chỉ máy chủ và cổng dịch vụ. Tuy nhiên, một
số dịch vụ không sử dụng đến
cổng (ví dụ dịch vụ cung cấp thời gian),
trong trường hợp này máy chủ phải gán
điểm truy nhập dịch vụ động và gán cho
mỗi hệ điều hành và đồng thời phải
có một tiến trình đặc biệt gọi là daemon
luôn theo dõi điểm truy nhập dịch vụ này. Thông
thường mỗi điểm cuối sẽ
được gán cho một dịch vụ riêng biệt,
nếu cài đặt mỗi dịch vụ lại sử
dụng các phương điều này của máy chủ
riêng biệt sẽ lãng phí tài nguyên. Điều này có thể
giải quyết bằng cách cung cấp một tiến
trình chuyên tiếp nhận yêu cầu của máy khách sau
đó chuyển cho tiến trình khác tiếp tục xử lý
dịch vụ.
Một vấn đề
khác cần phải tính đến khi thiết kế
phần mềm trên máy chủ là vấn đề làm
thế nào máy chủ có thể ngừng khi chưa hoàn thành
yêu cầu xử lý dịch vụ. Ví dụ trường
hợp máy khách đột ngột hủy trong khi máy chủ
đang thực thi yêu cầu, khi đó kết nối
giữa máy khách và máy chủ sẽ bị hủy bỏ, máy
chủ sẽ chờ một khoảng thời gian nhất
định sau đó sẽ hủy bỏ liên kết. Tuy
nhiên, giải pháp này sẽ không tốt trong trường
hợp liên kết giữa máy khách và máy chủ bị gián
đoạn do nguyên nhân khách quan (chất lượng
đường truyền kém...), giải pháp tốt hơn
sẽ là cung cấp báo hiệu kênh ngoài (out-band) cho liên kết giữa máy khách và máy
chủ hoặc thiết kế giao thức có khả
năng điều khiển tương tác. Điểm
cuối cùng trong thiết kế máy chủ là vấn
đề có lưu vết trạng thái hay không? Nếu không
lưu giữ thông tin trạng thái của máy khách thì máy
chủ có thể tùy ý thay đổi trạng thái của
mình mà không cần báo lại cho máy khách. Nếu lưu
trạng thái của máy khách thì máy chủ không những không
được phép tùy ý thay đổi trạng thái mà còn
tăng dung lượng lưu trữ, do đó có thể
dung hòa hai cách tiếp cận trên bằng cách lưu
trạng thái của máy khách trong một khoảng thời
gian nhất định.
Phần này sẽ
thảo luận về vấn đề cách triển khai
hệ thống điện toán cụm, đó là một trong
ba dạng kiến trúc cơ bản của hệ thống
phân tán, cách tổ chức cụm máy chủ cũng là một trong những
vấn đề cần phải giải quyết khi
mở rộng qui mô hệ thống.
Cụm máy chủ là
tập hợp các máy được kết nối qua
mạng, trên mỗi máy chạy một hoặc nhiều
tiến trình máy chủ. Thông thường cụm máy chủ
được kết nối trong mạng nội bộ
để bảo đảm băng thông đủ lớn nhằm
mục đích giảm thiểu độ trễ khi trao
đổi thông tin giữa các máy chủ trọng cụm.

Hình 5.10 Tổ chức
cụm máy chủ ba bên
Cụm máy chủ
được bố trí thành ba lớp: Lớp tiếp
nhận yêu cầu, lớp xử lý nghiệp vụ và
lớp lưu trữ dữ liệu. Việc phân cụm máy
chủ không những làm tăng hiệu năng xử lý mà
còn đảm bảo độ tin cậy cho hệ
thống. Ví dụ tại lớp xử lý yêu cầu
nghiệp vụ thì cần phải có những bộ vi
xử lý tốc độ cao nhưng lớp lưu trữ
dữ liệu thường đòi hỏi yêu cầu các
bộ đọc ghi nhanh.

Hình 5.11 Định
tuyến máy chủ phân tán
Nhược điểm
cơ bản của mô hình cụm máy chủ nằm ở
lớp tiếp nhận yêu cầu, nếu lớp này
ngừng hoặc bị quá tải thì sẽ ảnh
hưởng đến toàn bộ hệ thống. Một
mô hình khác đưa ra là tổ chức các máy chủ phân
tán. Thay vì chỉ có một thành phần tiếp nhận yêu
cầu sẽ bố chí nhiều thành phần tiếp
nhận yêu cầu, đây là mô hình đã áp dụng trong
hệ thống dịch vụ tên miền. Mô hình này đòi
hỏi phải cài đặt thêm bộ tối ưu hóa
định tuyến nhằm tạo điều kiện cho
các máy khách tìm được máy chủ dịch vụ một
cách nhanh nhất. Ngoài ra, máy khách cũng phải
được cấu hình để biết thông tin về
các máy chủ tiếp nhận yêu cầu.
Người sử
dụng luôn mong muốn công việc quản lý cụm máy
chủ phải tương tự
như trên một máy tính. Thực tế cho thấy các
thao tác quản lý cụm máy chủ phức tạp hơn
nhiều, cách đơn giản nhất là mở rộng
tính năng quản lý của một máy chủ,
người sử dụng phải truy nhập từ xa vào
mỗi máy và thực hiện các thao tác quản lý như trên
một máy. Một giải pháp khác là xây dựng phần
mềm cài đặt trên một máy quản trị, mỗi
máy tính trong cụm được thể hiện bằng
một nút và người dùng có thế thêm hoặc bớt
bất kỳ mày chủ nào. Như vậy, thay vì phải
truy nhập vào từng máy thì phần mềm quản lý
sẽ thu thập thông tin từ mỗi máy chủ và cung cấp
giao diện quản lý cho người sử dụng. Tuy
nhiên giải pháp này chỉ phù hợp với mô hình nhỏ,
vấn đề sẽ phức tạp hơn rất
nhiều đối với cụm máy chủ có qui mô
lớn, vì vậy giải pháp quản lý cụm máy chủ lớn
vẫn đang tiếp tục nghiên cứu.
Giả sử cụm có N
nút và xác suất xảy ra
lỗi trên mỗi nút là p, xác xuất m nút đồng
thời xảy ra lỗi được tính theo công
thức của lý thuyết xác suất thống kê như
sau:

Ví dụ cụm máy
chủ gồm N=1000 nút, xác suất xảy ra lỗi trên
mỗi máy chủ là p=0.001, áp dụng công thức trên
để tính xác suất không có máy nào bị lỗi sẽ
cho kết quả như sau:


= 0.367695
Từ đầu chương trình chúng
ta mới chỉ tập trung vào vấn đề trao
đổi dữ liệu trong hệ thống phân tán mà
chưa đề cập đến vấn đề di
chuyển các thành phần khác của tiến trình. Để
tăng hiệu suất và độ linh hoạt của
hệ thống, đôi khi phải di chuyển di chuyển
các chương trình hoặc đoạn mã chương
trình, quá trình đó gọi là di trú mã.
Thông thường, di trú mã trong các hệ
thống phân tán thực hiện dưới dạng di trú
tiến trình, toàn bộ
tiến trình được di chuyển từ máy này
sang máy khác, đây là công việc đòi hỏi chi phí cao và
phức tạp. Lý do phải di chuyển tiến trình
vẫn là vấn đề hiệu năng của hệ
thống, các yêu cầu xử lý cần phải
được chuyển tới những máy ít tải
hơn, tải ở đây được hiểu là
tỉ lệ sử dụng CPU, RAM và một số yếu
tố khác. Các thuật toán phân tải đưa ra quyết
định liên quan đến vấn đề xác
định và phân phối lại nhiệm vụ dựa
trên số lượng bộ xử lý đóng vai trò quan
trọng trong các hệ thống tính toán với tần
suất lớn. Tuy nhiên, trong các hệ thống phân tán
hiện đại, vấn đề truyền dữ
liệu trên được coi trọng hơn việc
tối ưu hóa khả năng tính toán. Ngoài ra, vì các lý do
liên quan đến vấn đề nền tảng không
thống nhất hoặc mạng máy tính mà quyết
định di trú mã có tính chất định tính chứ
không dựa trên các mô hình toán học. Ví dụ, nếu máy
khách cần phải tải một lượng dữ liệu
lớn từ máy chủ về để xử lý thì có
thể di trú đoạn mã trên máy khách về máy chủ và
khi đó máy khách chỉ nhận kết quả đã
được tính toán trên tập dữ liệu máy khách yêu
cầu. Ngược lại, đối với những
trường hợp người dùng phải cung cấp
thông tin để máy chủ xử lý, thao tác kiểm tra tính
hợp lệ của thông tin đầu vào nên
được thực hiện trên máy khách, như vậy
không những giảm tải cho máy chủ mà còn giảm
lượng thông tin lưu chuyển trên mạng.

Hình 5.12 Nguyên lý cấu
hình động cho máy khách
Di trú mã cũng cần thiết
trong các trường hợp xử lý song song, nhưng không
phải trên một máy tính. Ví dụ, để thực
hiện nhiệm vụ tìm kiếm thông tin trên mạng,
người ta sử dụng một đoạn mã di trú
gọi là Agent, đoạn mã này sẽ di chuyển từ
trang này sang trang khác, khi dừng lại ở trang nào nó
sẽ tiếp tục nhân bản đoạn mã đó. Ngoài
ra, kỹ thuật di trú mã còn làm cho hệ thống phân tán
linh hoạt hơn, ví dụ mô hình đa phương trong
các ứng dụng khách/chủ. Di trú mã giữa các máy đòi
hỏi hệ thống phân tán phải được
cấu hình động. Ví dụ, giả sử máy chủ
cung cấp giao diện truy nhập tập tin, nó phải xây
dựng một giao thức riêng. Thông thường, máy khách
sẽ dựa trên giao thức này để liên kết
với các ứng dụng khác. Đây là giải pháp tĩnh,
nó đòi hỏi phải xây dựng giao thức
trước khi phát triển phần mềm trên máy khách. Có
thể sử dụng giải pháp động bằng cách
đặt các đoạn mã vào một kho lưu trữ, máy
khách sẽ tải một đoạn mã cần thiết
từ kho lưu trữ đó, sau một số bước
khởi tạo sẽ kết nối đến máy chủ
cung cấp dịch vụ.
Một tiến trình bao
gồm phần mã chứa tập các lệnh của chương
trình đang chạy, phần tài nguyên chứa các tham
chiếu đến tất cả các tài nguyên bên ngoài mà
tiến trình đang sử dụng và phần thực thi
chứa các trạng thái hiện hành của tiến trình. Việc
di trú mã được hiểu là di chuyển một
phần hay toàn bộ tiến trình, người ta phân làm hai
loại di trú yếu (Weak mobility) và di trú mạnh (Strong
mobility). Di trú yếu chỉ truyền phần mã và một
số các dữ liệu khởi động của
tiến trình, một chương trình được
truyền đi luôn được bắt đầu
từ trạng thái khởi động và chỉ yêu cầu
máy đích thực thi yêu cầu
đó. Di trú mạnh truyền cả phần mã và
phần thực thi, tiến trình đang chạy có thể tạm
dừng để chuyển đến một máy khác và
tiếp tục thực hiện tiến trình đó, mô hình
này khó thực hiện hơn. Di
trú được do gửi khởi sướng hoặc do
bên nhận khởi sướng.
Mô hình di trú mạnh
đòi hỏi chú ý đặc biệt tới những tài
nguyên tiến trình đang sử dụng. Ví dụ một
tiến trình đang sử dụng một cổng nào
đó, khi di trú sang máy khác đồng nghĩa với
việc từ bỏ cổng đang sử dụng và
đồng thời thiết lập cổng tương
ứng trên máy mới. Có ba mức tham chiếu giữa
tiến trình và tài nguyên: Mạnh, yếu và rất yếu.
Ở mức thứ nhất, tiến trình tham chiếu
tới tài nguyên thông qua định danh, ví dụ các tiến
trình sử dụng đường dẫn URL. Mức
thứ hai, tiến trình chỉ đòi hỏi giá trị
của tài nguyên, ví dụ tiến trình sử dụng các
thư viện lập trình. Mức thứ ba, tiến trình
chỉ tham chiếu đến loại tài nguyên, ví dụ
tham chiếu tới các thiết bị ngoại vi. Khi di trú
mã thì chỉ có thể thay đổi tham chiếu
đến tài nguyên mà không được phép thay
đổi mức độ tham chiếu.
Di trú mã trên các hệ
thống đồng nhất sẽ không gặp những
trở ngại lớn là do các máy tính cùng chạy trên
một nền tảng phần cứng và hệ
điều hành, vấn đề sẽ trở nên khó
khăn hơn rất nhiều nếu hệ thống bao
gồm các máy tính sử dụng nền tảng khác nhau.
Ngoài ra, vấn đề ngôn ngữ lập trình cũng gây
trở ngại lớn trong di trú mã, các ứng dụng
thường được lập trình bằng các ngông
ngữ lập trình bậc cao như Pascal, C hay Java...
Để giảm thiểu sự phụ thuộc ngôn
ngữ lập trình, một giải pháp đã
được đề xuất đó là việc di trú
không chỉ thực hiện với tiến trình mà thực
hiện với toàn bộ môi trường tính toán, với
đề xuất này việc di trú phải thực hiện
ba bước:
1.
Chuyển các trang bộ nhớ sang máy
mới và sẽ cập nhật lại những trang bị
thay đổi trong quá trình di trú.
2.
Ngừng máy ảo, di trú bộ nhớ và
khởi tạo máy ảo mới.
3.
Khởi tạo các tiến trình trên máy
ảo mới và sao chép các trang bộ nhớ theo yêu cầu
của tiến trình đó.
CHƯƠNG 6:
QUẢN TRỊ GIAO TÁC VÀ ĐIỀU
KHIỂN TƯƠNG TRANH
Dữ liệu trong
hệ thống phân tán dữ liệu đó có thể
được lưu trữ tại một hoặc
nhiều vị trí khác nhau, các tiến trình truy xuất
dữ liệu để thực hiện các công việc
tính toán theo yêu cầu nghiệp vụ. Nếu nhiều
tiến trình đồng thời truy xuất dữ liệu
thì có thể dẫn tới hiện tượng
tương tranh, hậu quả tất yếu sẽ làm suy
giảm hiệu năng hệ thống và thậm chí có
thể dẫn đến sai lệch thông tin. Điều
khiển tương tranh là cơ chế cho phép nhiều
giao tác thực hiện đồng thời mà không xảy ra
sự tranh chấp giữa các giao tác. Giả sử tài
khoản X muốn chuyển cho tài khoản Y một
lượng tiền bằng Z% số dư tài khoản
hiện hành của Y, theo nghiệp vụ ngân hàng,
trước hết sẽ lấy số dư hiện nay
của tài khoản Y nhân với tỉ lệ Z sẽ cho
lượng tiền phải chuyển khoản, công
việc còn lại chỉ là hai thao tác cập nhật
số dư mới của các tài khoản Y và X. Đoạn
mã chương trình sau minh họa một ví dụ về
nghiệp vụ chuyển khoản trong ngân hàng để
thực hiện nhiệm vụ trên:
MoneyTransfer(Accounts X,
Accounts Y, float Z )
{
float Balance= Y.GetBalance();
float
Trans= Balance/Z;
Y.SetBalance(Balance +Trans);
X.Withdraw(Trans);
}
Ví dụ ba tài khoản
A, B và C có giá trị lần lượt là $100, $200 và $300, A
và C cùng chuyển cho B số tiền
bằng 10% số dư tài khoản
của B, đoạn mã chương trình trên sẽ thực
hiện như sau.
|
A chuyển cho B
|
C chuyển cho B
|
|
MoneyTransfer(A,B,0.1)
|
MoneyTransfer(C,B,0.1)
|
|
float Balance= B.GetBalance();
float Trans= Balance/0.1;
B.SetBalance(Balance+Trans);
A.Withdraw(Trans);
|
float Balance= B.GetBalance();
float Trans= Balance/0.1;
B.SetBalance(Balance+Trans);
C.Withdraw(Trans);
|
Hai giao tác trên
được gửi đến máy chủ cùng một lúc,
vì vậy các chỉ thị lệnh sẽ lần lượt
được thực hiện
và một trong những khả năng có thể xảy
ra như sau:
|
float Balance= B.GetBalance();//200$
float Trans= Balance/0.1; // 20$
B.SetBalance(Balance+Trans); //220$
A.Withdraw(Trans); // 80$
|
float Balance= B.GetBalance(); //200$
float Trans= Balance/0.1; // 20$
B.SetBalance(Trans); //220$
C.Withdraw(Trans); //280$
|
Số dư
tài khoản B là 220$ trong khi mỗi tài khoản A và C đều
bị trừ 20$, số dư tài khoản B đúng ra phải
là 242$, như vậy thủ tục tính toán không những
đã thực hiện sai nghiệp vụ mà còn gây thất
thoát cho tài khoản A hoặc C, hiện tượng này gọi
là mất mát cập nhật. Tương tự như vậy,
giả sử A chuyển cho B 50$, tại thời điểm
giao dịch nhân viên ngân hàng thực hiện thao tác kiểm
tra số dư của tất cả các tài khoản, các thao
tác được thực hiện như sau:
|
A chuyển cho B 10$
|
Nhân viên kiểm tra số
dư
|
|
A.Withdraw(10);
B.Deposit(10);
|
float Total=A.GetBalance();
Total= Total+ B.GetBalance();
|
Tình huống
thực hiện trên máy chủ như sau:
|
A.Withdraw(10);
// 100$
B.Deposit(10);
// 210$
|
float Total=A.GetBalance(); // 90$
Total= Total+ B.GetBalance(); // 290$
|
Hiện tượng đọc kết
quả không đồng nhất đã xảy ra trong
trường hợp này, tổng số dư phải là 300$
chứ không phải 290$ như kết quả chương
trình đã đưa ra. Nguyên nhân của hai lỗi trên
được xác định là do trình tự thực
hiện các thao tác không theo mong muốn và xung đột
đã xảy ra trong khi thực hiện các giao tác. Hai giao tác
được gọi là xung đột nếu kết
quả tổ hợp thực hiện các lệnh của
chúng phụ thuộc vào thứ tự thực hiện, do
đó cần phải xác định các lệnh có thể gây
ra xung đột và phải tuần tự hóa thứ tự
thực hiện của chúng.
Giao tác gồm một hoặc nhiều
câu lệnh truy xuất dữ liệu và chúng
được thực hiện như một đơn
vị thống nhất, nghĩa là không thể thêm hay
bớt bất kỳ câu lệnh nào. Giao tác được
chia thành giao tác phẳng, giao tác lồng ghép và giao tác phân tán.
Giao tác có thể gồm nhiều câu lệnh đọc/ghi
dữ liệu và phải đảm bảo bốn tính
chất sau:
-
Tính chất
nguyên tử (Atomic): Đối với thế giới bên
ngoài thì giao tác không thể chia nhỏ hơn
được, các lệnh trong giao tác đều
được thực hiện hoặc không có lệnh nào
được thực hiện. Tính nguyên tử đòi
hỏi nếu một giao tác bị hủy giữa
chừng thì kết quả của các lệnh đã thực
hiện sẽ bị hủy bỏ.
-
Tính chất nhất
quán (Consistent): giao tác không xâm phạm tính chất bất
biến của hệ thống, nghĩa là luôn phải
đảm bảo hệ thống toàn vẹn.
-
Tính chất cô
lập (Isolated): Khi có nhiều giao tác đồng thời
thực hiện thì mỗi giao tác sẽ hoạt
động độc lập và
không làm ảnh hưởng đến các giao tác khác.
-
Tính chất bền
vững (Durable): Khi giao tác đã cam kết thì các thay
đổi đối với nó không phải là tạm
thời mà là những thay đổi bền vững,
nếu không cam kết thì sẽ tự động phục
hồi, coi như chưa từng thực hiện các
lệnh trong giao tác.
Một giao tác thỏa mãn bốn tính trên gọi là giao
tác phẳng, hạn chế chính của giao tác phẳng là
chúng không cho phép tách riêng các kết quả được
cam kết hay hủy bỏ. Giao tác bắt đầu
bằng lệnh mở giao tác, tiếp theo là các chuỗi các
lệnh thao tác với dữ liệu và kết thúc đóng
giao tác bằng lệnh cam kết (commit) hoặc hủy
bỏ (abort, rollback).

Hình 6.1 Các trường hợp thực
hiện giao tác phẳng
Giao tác lồng nhau được
cấu thành từ một số giao tác con, nói cách khác là
trong giao tác lại gồm nhiều giao tác con, mỗi giao tác
con cũng có thể thực thi một hay nhiều giao tác
con của chính nó.

Hình 6.2 Cấu trúc giao
tác lồng nhau
Trong giao tác lồng
nhau, các giao tác con trên cùng một mức có thể chạy
đồng thời với nhau, các lệnh cam kết hoặc
hủy bỏ của các giao tác con hoàn toàn độc lập
với nhau.
Giao tác phân tán là những giao tác thực
hiện thao tác với dữ liệu được đặt
trên nhiều máy tính khác nhau, nó phải đảm bảo
tính thống nhất trong việc thực hiện các thao tác
trên tất cả các máy tính.
Có ba cách tiếp cận giải quyết
vấn đề tương tranh: Điều khiển tương
tranh bi quan, điều khiển tương tranh lạc quan
và điều khiển tương tranh dựa trên nhãn
thời gian. Hai cách tiếp cận đầu tiên trái
ngược nhau về quan điểm, điều
khiển tương tranh bi quan nhìn nhận hệ thống
luôn tiềm ẩn tương tranh, trong khi đó
điều khiển tương tranh lạc quan nhìn
nhận không xảy ra tương tranh và khi nào xảy ra thì
mới giải quyết. Cách sử dụng khóa là một cách
tiếp cận điển hình về điều khiển
tương tranh bi quan, nhược điểm cơ
bản của nó là tăng tải xử lý cho hệ
thống.
Một phương pháp để
đảm bảo tính tuần tự là yêu cầu việc
truy xuất đến hạng mục dữ liệu
được tiến hành theo kiểu loại trừ
tương hỗ, nghĩa là trong khi một giao dịch
đang truy xuất một mục dữ liệu thì không
một giao tác nào khác có thể sửa đổi mục
dữ liệu này. Phưong pháp chung nhất được
dùng để thực thi yêu cầu này là cho phép một giao
tác truy xuất một mục dữ liệu khi và chỉ khi
nó đang giữ khóa trên mục dữ liệu đó. Tư
tưởng chính của các thuật toán này là các thao tác trên
một đơn vị dữ liệu nếu có xung
đột thì tại một thời điểm chỉ cho
phép một giao tác thực hiện, điều này
được thực hiện dựa trên cơ chế khóa.
Để truy xuất một mục
dữ liệu, giao tác Ti trước tiên phải
khóa mục dữ liệu này và khi thực hiện xong thì phải
giải phóng khóa. Nếu mục dữ liệu này đã
bị khóa bởi một giao tác khác và khóa đó không
tương thích thì bộ điều khiển tương
tranh sẽ không cấp khóa cho đến khi khóa này
được giải phóng. Một giao tác cần thiết
phải giữ một khóa trên một mục dữ
liệu chừng nào mà nó còn truy xuất mục này. Hơn
nữa, đối với một giao tác việc tháo khóa
ngay sau khi truy xuất cuối cùng đến mục dữ
liệu không luôn luôn là điều mong muốn vì như
vậy tính khả tuần tự có thể không
được đảm bảo cho đến khi tất
cả các khóa không tương thích do các giao tác khác giải
phóng. Sử
dụng khóa có thể dẫn đến trạng thái khóa chết
(deadlock), đó là trạng thái mỗi thành viên của
nhóm các giao tác phải chờ lẫn nhau giải phóng khóa. Có
thể sử dụng đồ thị wait-for để thể hiện các
quan hệ chờ giữa các giao tác tương tranh tại
máy chủ. Để hạn chế hiện tượng
khóa chết có thể áp dụng các biện pháp sau:
-
Khi bắt đầu giao tác sử dụng khóa tất
cả các mục dữ liệu.
-
Mỗi giao tác yêu cầu khóa trên các mục dữ liệu
theo thứ tự đã định nghĩa trước.
-
Mỗi khóa có khoảng thời gian giới hạn, sau thời gian
đó sẽ không được bảo vệ.
Điều khiển tương tranh
lạc quan cho phép các giao tác được phép tiếp tục nếu
không có xung đột với các giao tác khác, nếu phát hiện
xung đột thì sẽ hủy bỏ giao tác nào đó. Mỗi
giao tác gồm ba pha:
-
Pha đọc: sử dụng bản tạm thời
cho mỗi mục dữ liệu được cập nhật
-
Pha phê chuẩn: Kiểm tra xem có xung đột hay
không
-
Pha ghi: Nếu được phê chuẩn không có xung
đột thì chuyển bản dữ liệu tạm thời
thành vĩnh viễn
Để
được phê chuẩn, mỗi giao tác được
gán số tuần tự khi bước vào pha phê chuẩn, giao
tác luôn luôn kết thúc pha đọc của mình sau tất cả
các giao tác có số thứ tự thấp hơn. Các pha phê
chuẩn có thể chồng nhau nhưng số hiệu phải
được gán tuần tự, tất cả các pha ghi
được thực hiện tuần tự theo số hiệu
đã được gán và không tái sử dụng số thứ
tự đã gán cho giao tác, như vậy không cần kiểm
tra xung đột ghi-ghi. Điều khiển tương
tranh lạc quan sử dụng hai dạng phê chuẩn: Phê
chuẩn ngược và phê chuẩn xuôi. Phê chuẩn ngược
kiểm tra với các giao tác đã bước vào giai đoạn
phê chuẩn trước nó trong khi đó phê chuẩn xuôi lại
kiểm tra với các giao tác sau nhưng vẫn đang hoạt
động.
Một cách tiếp cận khác trong
điều khiển tương tranh là gán nhãn thời gian
cho các giao tác, mỗi giao tác được
gán nhãn thời gian duy nhất khi bắt đầu. Mỗi
lệnh mang nhãn thời gian của giao tác đã được
cấp phát và được phê chuẩn khi thực hiện,
nếu câu lệnh không được thực hiện thì
giao tác sẽ bị hủy bỏ ngay lập tức. Sử
dụng giải thuật gán nhãn thời gian Lamport sẽ
đảm bảo cho mỗi thao tác được gán một
nhãn thời gian duy nhất và như vậy sẽ không còn hiện
tượng tương tranh, tuy nhiên cần phải có một
thành phần điều phối để ưu tiên những
giao tác có thời gian thực hiện nhanh và thường
xuyên hơn.
CHƯƠNG 7:
PHỤC
HỒI VÀ TÍNH CHỊU LỖI
Lỗi có thể xảy ra trong bất
kỳ hệ thống thông tin nào, đặc biệt trong
môi trường phân tán lỗi của bất kỳ một
thành phần nào cũng có thể ảnh hưởng
đến toàn bộ hệ thống. Nếu hệ
thống phụ thuộc hoàn toàn vào một máy chủ,
lỗi xảy ra trên máy chủ đó sẽ ảnh
hưởng đến toàn bộ hệ thống. Một
trong những mục tiêu quan trọng khi thiết kế
hệ thống phân tán là phải xây dựng hệ thống
sao cho lỗi xảy ra trên một máy chủ nào đó sẽ
ảnh hưởng ít nhất đến vận hành chung
của hệ thống.
Trong hệ thống phân tán, lỗi có
thể xảy ra trên bất cứ thành phần nào, dù cho
đó lỗi máy chủ hay lỗi mạng thì đều làm
suy giảm hiệu năng và thậm chí làm gián đoạn
dịch của hệ thống. Một yêu cầu quan
trọng khi xây dựng hệ thống phân tán là phải
lường trước được các lỗi có
thể xảy ra và sẵn sàng phương án xử lý sao
cho tối thiểu hóa các ảnh hưởng của nó
đến hệ thống. Nói cách khác, khi có lỗi xảy
ra thì hệ thống vẫn vận hành theo cách có thể
chấp nhận được, nghĩa là hệ thống
phải có khả năng chịu được lỗi.
Chủ đề về tính chịu lỗi của hệ
thống phân tán đã được nghiên cứu khá
nhiều trong khoa học máy tính.
Tính chịu
lỗi của một hệ thống liên quan mật
thiết tới khái niệm tính tin cậy của hệ
thống, một hệ thống được coi là có
khả năng chịu lỗi nếu đáp ứng
được các tiêu chí sau:
-
Khả
năng sẵn sàng phục vụ của hệ thống
-
Độ tin
cậy của hệ thống
-
Độ an
toàn của hệ thống
-
Khả
năng bảo trì hệ thống
Khả năng
sẵn sàng phục vụ của hệ thống thể
hiện ở thời gian đáp ứng yêu cầu của
mỗi dịch vụ, trong trường hợp lý
tưởng nó phải được thực hiện theo
thời gian thực. Độ tin cậy của hệ thống
liên quan tới tính chính xác của thông tin mà không phụ
thuộc vào yếu tố thời gian. Độ an toàn
của hệ thống thể hiện ở khả năng
bảo đảm an toàn cho dữ liệu ngay cả khi có
những sự cố lớn. Khả năng bảo trì
hệ thống thể hiện ở khả năng
phục hồi hệ thống sau khi xảy ra lỗi, nó
phải được thực hiện một cách
đơn giản và trong thời gian nhanh nhất và tổn
thất thông tin ở mức thấp nhất.
Một hệ
thống bị coi là lỗi nếu nó không cung cấp chính
xác các dịch vụ như đã thiết kế. Nếu
coi hệ thống phân tán là tập hợp máy chủ trao
đổi thông tin với nhau và với các máy khách thì
lỗi có thể xảy ra ở trên các máy chủ hoặc
trên hạ tầng mạng. Việc vận hành sai qui cách
cũng có thể gây ra lỗi, nếu một máy chủ
hoạt động phụ thuộc vào máy chủ khác thì nó
cũng sẽ bị ảnh hưởng nếu lỗi
xảy ra trên máy chủ khác. Xét về tần suất, lỗi
được phân chia thành ba loại sau:
-
Lỗi
nhất thời: Là loại lỗi xảy ra một lần
sau đó không xuất hiện lại.
-
Lỗi
lặp: Là loại lỗi mà chúng xuất hiện nhiều
lần, có thể theo chu kỳ hoặc không. Lỗi này
thường gây ra các hậu quả nghiêm trọng vì chúng rất khó xác
định được.
-
Lỗi lâu
dài: Là loại lỗi vẫn tồn tại ngay cả khi
thành phần gây lỗi đó đã được sửa
chữa.
Xét về mức
độ ảnh hưởng, lỗi được phân
thành năm loại sau:
-
Máy chủ
bị lỗi nghiêm trọng : Máy chủ có thể bị
treo và dừng mọi hoạt động cung cấp
dịch vụ, cách duy nhất để giải quyết
vấn đề này là khởi động lại máy
chủ.
-
Máy chủ
xử lý lỗi: Máy chủ không nhận được yêu
cầu từ máy khách, nhận được yêu cầu
nhưng không thể trả lời hoặc không thể
trả về kết quả xử lý cho máy khách. Trong trường hợp này cần
phải kiểm tra kết nối giữa máy khách và máy
chủ, thường thường đó là các lỗi
mạng.
-
Lỗi
thời gian: Máy chủ không đáp ứng được
thời gian xử lý yêu cầu của máy khách.
-
Lỗi
kết quả xử lý: Thông tin trả về của máy
chủ không chính xác, có thể là giá trị sai.
-
Lỗi không xác
định: Máy chủ trả về các giá trị không mong
muốn và những giá trị đó chưa từng xảy
ra, việc xác định nguyên nhân và biện pháp xử lý
các lỗi này rất khó.
Một hệ
thống chịu được lỗi thì cần phải
có khả năng che giấu được các lỗi, nói
cách khác người sử dụng không hề biết
hoặc ít biết về sự cố đối với
mạng dịch vụ. Một phương pháp phổ
biến thường được áp dụng trong các hệ
thống phân tán là xây dựng các thành phần dư thừa:
•
Dư
thừa thông tin : bổ sung
thêm các bit dư thừa để phát hiện lỗi và
phục hồi lỗi. Ví dụ trong việc truyền
dữ liệu thường thêm vào các bit kiểm tra
chẵn lẻ, mã Haming, CRC… để phát hiện lỗi và
phục hồi lỗi.
•
Dư
thừa thời gian: khi
một hoạt động đã được thực
hiện, nếu dư thừa thời gian nó có thể
được thực hiện lại. Kĩ thuật
dư thừa thời gian phù hợp khi lỗi là nhất
thời và lỗi chập chờn. Có thể sửa lỗi
bằng cách thực hiện lại các giao tác bị lỗi,
Tuy nhiên phải
chú ý tính đúng đắn đối với các thao tác
thực hiện theo thời gian thực.
•
Dư
thừa vật lý: bổ
sung thêm tài nguyên vật lý, thay vì sử dụng một thiết
bị thì sử dụng thêm nhiều thiết bị khác
để dự phòng.

Hình 7.1 Xây dựng hệ thống
dư thừa theo kiểu chuyển mạch
Hình 7.1 minh
họa kỹ thuật dư thừa theo tương tự
như hệ thống chuyển mạch, bình thường
hệ thống chỉ bao gồm 3 thành phần chính A, B, C.
Để đảm bảo khả năng chịu
lỗi, chúng ta thêm các thành phần Ai, Bi, Ci
tương ứng với A, B, C và duy trì ở trạng thái
dự phòng. Khi có lỗi xảy ra, hệ thống sẽ
tự động chuyển đến một trong các thành phần dư
thừa tương ứng, sau khi khắc phục xong
lỗi, hệ thống sẽ chuyển về xử lý trên
các thành phần chính của hệ thống.
Vấn đề cơ bản trong việc cung cấp tính
năng chịu lỗi trong hệ thống phân tán là
việc phòng chống và khắc phục lỗi. Có thể
xây dựng hệ thống chịu lỗi bằng
phương pháp dư thừa vật lý, tuy nhiên giải
pháp này khá tốn kém, phần này sẽ đề cập
tới một số giải pháp mềm để giải
quyết vấn đề lỗi trong các hệ thống
phân tán.
Giải pháp chính trong việc chống
lỗi là tổ chức một số tiến trình giống
nhau thành các nhóm xử lý, khi có thông điệp được gửi tới thì tất cả
các thành viên trong nhóm đều nhận được thông điệp đó. Mỗi nhóm
có thể được tổ chức thep mô hình ngang hàng
hoặc mô hình phân cấp, một tiến trình có thể là
thành viên của một số nhóm khác nhau.

Hình 7.2 Nhóm các tiến trình trong hệ
thống phân tán
Vấn đề mới nảy sinh
đối với loại thiết kế này là việc
quản lý và phối hợp hoạt động giữa các
tiến trình. Hình 7.2 minh họa hai giải pháp tổ
chức nhóm tiến trình trong các hệ thống phân tán,
việc tổ chức này hoàn toàn phụ thuộc vào các
thuật toán xử lý bên trong mỗi tiến trình. Với mô
hình ngang hàng, tất cả các thành viên đều nhận
được yêu cầu gửi đến nhưng
chỉ có một thành viên được phép xử lý,
như vậy các thành viên trong nhóm phải thực hiện
quá trình bầu chọn. Với mô hình phân cấp, thành viên
điều phối sẽ quyết định tiến
trình nào được phép thực hiệu yêu cầu, tuy
nhiên mô hình này lại quay trở lại mô hình xử lý
tập trung nhưng đảm bảo tính mềm dẻo
hơn.
Che giấu lỗi trong hệ thống phân
tán tập trung vào trường hợp có tiến trình
bị lỗi, tuy nhiên trước
hết cần phải xem xét các
trường hợp lỗi truyền tin. Sử
dụng nhóm tiến trình cũng là một trong các biện
pháp che giấu lỗi, nhóm các tiến trình giống nhau
sẽ che giấu một tiến trình nào đó bị
lỗi. Nhân bản một tiến trình sau đó gộp
chúng thành một nhóm, có hai phương pháp nhân bản: giao thức
dựa trên thành phần chính và giao thức dựa trên ghi
nhân bản. Trong phương pháp che giấu lỗi dựa
trên thành phần chính, các tiến trình trong nhóm tổ chức
theo mô hình phân cấp. Một tiến trình đóng vai trò
tiến trình chính có nhiệm vụ điều phối
tất cả các thao tác ghi. Nếu tiến trình chính của
nhóm dừng hoạt động thì các tiến trình sao
lưu sẽ thực hiện giải thuật bầu
chọn để lựa chọn tiến trình chính mới.
Nếu dựa trên ghi nhân bản thì các tiến trình trong nhóm
tổ chức theo mô hình nhóm ngang hàng, vấn đề
nằm ở câu hỏi cần nhân bản với số
lượng là bao nhiêu.
Tổ chức các
tiến trình nhân bản thành nhóm làm tăng khả năng chịu
lỗi, nếu máy khách có thể dựa trên quyết định
của nó thông qua cơ chế bầu chọn thì vẫn có
thể chấp nhận kết quả sai lệch của k
trong số 2k+1 tiến trình. Vấn đề trở nên phức
tạp nếu muốn các tiến trình trong nhóm đạt
được sự đồng thuận trong một số
trường hợp như bầu chọn thành viên điều
phối, ra quyết định khẳng định trong
các giao tác phân tán, phân chia công việc cho các tiến trình thực
thi, thực hiện đồng bộ … Nếu các tiến
trình và truyền thông đều ở trạng thái hoạt
động tốt thì sẽ không có vấn đề gì xảy
ra, ngược lại sẽ nảy sinh vấn đề
đạt được sự đồng thuận giữa
các tiến trình. Mục đích chung của thuật toán đồng
thuận phân tán là để tất cả các tiến trình không
lỗi đạt được sự đồng thuận
về một vấn đề nào đó và đạt
được sự đồng thuận sau một số
bước hữu hạn. Vấn đề trở nên phức
tạp hơn bởi thực tế các giả định khác
nhau về hệ thống nền tảng đòi hỏi các
giải pháp khác nhau, Turek và Shasha đã chỉ ra bốn
trường hợp sau:
1. Hệ thống
đồng bộ với hệ thống không đồng bộ,
một hệ thống được coi là đồng bộ
khi và chỉ khi các tiến trình vận hành trong chế độ
theo sát nhau. Về hình thức, phải có hằng số
s>=1, nếu bất kỳ tiến trình nào thực hiện
s+1 bước thì tiến trình khác cũng phải thực
hiện ít nhất một bước, ngược lại
sẽ là không đồng bộ.
2. Trễ truyền
thông bị giới hạn hay
không giới hạn,
độ trễ bị giới hạn khi và chỉ khi bất kỳ một
thông điệp nào cũng sẽ được phân phát
trong một khoảng thời gian nhất định.
3. Phân phát thông điệp
theo thứ tự hay không theo thứ tự, phân phát thông
điệp theo thứ tự nghĩa là bên nhận phải
nhận được các thống điệp đúng theo
thứ tự bên gửi đã phát đi. Thậm chí phân phát
thông điệp theo thứ tự còn phải tính đến
sự nhất quán thứ tự các thông điệp trên mỗi
tiến trình của hệ thống phân tán.
4. Truyền thông
điệp theo phương pháp điểm – điểm
hay truyền theo nhóm.
Trên hình 7.3 các
trường hợp có thể đạt được sự
đồng thuận được đánh dấu X, tất
cả những trường hợp khác đều không có
giải pháp thực hiện, cần lưu ý rằng các tiến
trình của hệ thống phân tán trong thực tế hầu
hết đều vận hành theo phương thức không
đồng bộ, truyền thông điểm điểm và
có ràng buộc thời gian khi truyền thông điệp. Từ
kết quả trên hình vẽ 7.3 cho thấy hệ thống
cần sử dụng phân phát thông điệp theo thứ tự
và tin cậy như giao thức TCP đã cung cấp.
|
|
Thứ tự thông điệp
|
|
|
Không
|
Có
|
|
Phương thức xử lý
|
Đồng bộ
|
|
|
X
|
|
Ràng buộc
|
Độ trễ truyền thông
|
|
|
|
X
|
|
|
Không đồng bộ
|
X
|
X
|
X
|
X
|
Không ràng buộc
|
|
|
|
X
|
X
|
|
|
Điểm – Điểm
|
Nhóm
|
Điểm – Điểm
|
Nhóm
|
|
|
Phương pháp truyền thông
|
|
Hình 7.3 Các trường hợp đạt được
sự đồng thuận
|
Vấn đề trên đã
được Lamport nghiên cứu và đưa ra bài toán
đồng thuận phức tạp (Bazentine), đề
cập đến nhiều cuộc chiến mà một
số đội quân cần phải đạt
được sự đồng thuận, ví dụ về
quân số, trong khi phải đối mặt với
những thông tin sai lệch. Trong ví dụ này ta coi các
tiến trình vận hành theo phương thức
đồng bộ, thông điệp truyền theo
phương pháp điểm-điểm, có thứ tự và
giới hạn thời gian
truyền thông. Giả sử hệ thống gồm N tiến
trình, mỗi tiến trình i cung cấp giá trị Vi
cho các tiến trình khác, mục
tiêu cần đạt trong đồng thuận lỗi sẽ
được thực hiện bằng cách cho phép mỗi
tiến trình xây dựng vector V gồm N phần tử với
V[i]=Vi nếu tiến trình i không lỗi và V[i] không
xác định nếu tiến trình i bị lỗi. Quá trình
tiến tới sự đồng thuận sẽ được
thực hiện theo bốn bước sau:
1.
Mỗi tiến trình i không lỗi gửi giá trị Vi
cho các tiến trình khác sử dụng phương pháp truyền
thông điểm-điểm tin cậy, tiến trình lỗi
gửi giá trị bất kỳ.
2.
Kết quả nhận được từ bước
1 sẽ tập hợp lại thành vector V.
3.
Mỗi tiến trình gửi vector V của bước
2 cho các tiến trình khác.
4.
Mỗi tiến trình kiểm tra phần tử thứ
i trong các Vector nhận được ở bước 3, nếu
kết quả kiểm tra chiếm đa số thì đặt
giá trị vào Vector kết quả đồng thuận, nếu
không thì đặt giá trị không xác định UNKNOWN.
Ví dụ, hệ
thống gồm bốn thành viên như trên hình 7.4 (a), các tiến
trình 1, 2, 4 đều gửi giá trị tương ứng
1, 2 và 4 cho các tiến trình khác, tiến trình số 3 bị lỗi
nên gửi các giá trị bất kỳ x, y và z cho các tiến
trình 1, 2 và 4. Các thành viên khác trong hệ thống cần phải
đảm bảo sự đồng thuận về việc
tiến trình 3 có thực sự bị lỗi hay không. Kết
quả thực hiện ở bước 2, mỗi tiến
trình sẽ lưu giữ giá trị vector lần lượt
là (1,2,x,4),
(1,2,y,4), (1,2,3,4), (1,2,z,4). Thực hiện bước 3, các
tiến trình 1, 2 và 4 gửi giá trị vector đã nhận
được ở bước 2 cho các tiến trình khác,
trong khi đó tiến trình 3 tiếp tục gửi những
giá trị không xác định, kết quả là các tiến
trình 1, 2 và 4 sẽ nhận được các vector như
hình 7.4 (c).
|

|
1
(1,2,x,4)
2
(1,2,y,4)
3
(1,2,3,4)
4
(1,2,z,4)
|
1
|
2
|
4
|
|
(1,2,y,4)
(a,b,c,d)
(1,2,z,4)
|
(1,2,x,4)
(e,f,g,h)
(1,2,z,4)
|
(1,2,x,4)
(1,2,y,4)
(i,j,k,l)
|
|
(a) Mỗi tiến trình gửi giá trị của
chúng cho các tiến trình khác
|
(b) Mỗi tiến trình xây dựng Vector
|
(c) Mỗi tiến trình lưu giữ các vector nhận
được ở bước 3
|
Hình 7.4 Thuật
toán đồng thuận phân tán
Tại bước 4, mỗi
tiến trình sẽ tự tổng hợp cho kết quả
cuối cùng cho mỗi phần tử thứ i của các
vector nhận được trong bước thứ ba,
nếu giá trị nào chiếm đa số thì sẽ đánh
dấu giá trị đó trong phần tử tương
ứng, ngược lại sẽ điền giá trị
không xác định. Giá trị
cuối cùng trong các tiến trình 1, 2 và 4 đều có giá
trị là (1,2,Unknow,4),
như vậy các tiến trình 1, 2 và 4 có thể đảm bảo
chắc chắn các tiến trình số 1, 2, 4 không bị lỗi
nhưng lại không thể đảm bảo tiến trình
số 3 có bị lỗi hay không.
|

|
1
(1,2,x)
2
(1,2,y)
3
(1,2,3)
|
1
|
2
|
|
(1,2,y)
(a,b,c)
|
(1,2,x)
(d,e,f)
|
|
(a) Mỗi tiến trình gửi giá trị của
chúng cho các tiến trình khác
|
(b) Mỗi tiến trình xây dựng Vector
|
(c) Mỗi tiến trình lưu giữ các vector nhận
được ở bước 3
|
Hình 7.5 Không xác
định được sự đồng thuận
Xét lại ví dụ
trên trong trường hợp có 3 tiến trình và 1 tiến
trình bị lỗi, áp dụng thuật toán trên sẽ cho kết
quả như trên hình 7.5, kết quả cuối cùng sau khi
hoàn bước 3 không có bất kỳ phần tử nào chiếm
đa số, vì vậy các tiến trình không lỗi 1 và 2
đều không đạt được sự đồng
thuận. Lamport đã chứng minh rằng, một hệ thống
có k tiến trình lỗi thì phải có 2k+1 tiến trình không lỗi,
như vậy tổng số tiến trình phải là 3k+1, nói
cách khác phải có trên 2/3 số tiến trình không lỗi.
Một cách khác
nhìn nhận vấn đề trên, hệ thống cần phải
đạt được đa số phiếu bầu của
các tiến trình không lỗi bất chấp sự hiện
diện của các tiến trình lỗi. Vói k tiến trình lỗi,
hệ thống cần phải được đảm bảo
rằng bầu chọn của chúng, cùng với bất kỳ
tiến trình không lỗi nào bị nhầm lẫn vì các tiến
trình lỗi, đều không trái với đa số bầu
chọn của các tiến trình không lỗi. Với 2k + 1 tiến trình không có lỗi, điều này có thể
đạt được bằng
cách yêu cầu tiến tới đồng thuận chỉ
khi nào có trên hai phần ba số phiếu bầu giống
nhau. Nói cách khác, nếu trên hai phần ba tiến trình đồng
thuận về
cùng một quyết định, quyết định này
tương ứng với đa số phiếu của nhóm
các tiến trình không lỗi. Tuy nhiên, tiến tới sự
đồng thuận có thể sẽ còn tồi tệ
hơn, Fischer đã chứng minh
rằng, trong các hệ thống phân tán mà các thông
điệp không đảm bảo được phân phát
trong một khoảng thời gian hữu hạn thì đồng
thuận cũng không thể đạt được ngay
cả khi chi có một tiến trình bị lỗi, mặc dù
tiến trình đó bị lỗi thầm lặng, những
hệ thống này làm chậm
các tiến trình một cách tùy tiện không thể phân
biệt với các tiến trình bị lỗi sụp
đổ. Nhiều kết quả lý thuyết khác cũng
chỉ ra khi nào có thể đạt được sự
đồng thuận, ví dụ các kết quả nghiên
cứu của Barborak, Turek và Shasha. Ngoài mô hình đồng
thuận đã đề cập trên còn phải kể
tới vấn đề đồng thuận trong các môi
trường cộng tác, điều này rất khó đạt
được trong các hệ thống thuộc về
nhiều miền quản lý khác nhau, Aiyer đã đề
cập tới vấn đề này trong các bài viết
về tính chịu lỗi BAR (Byzantine, Altruism, Rationality).
Phát hiện lỗi là một trong
những nhiệm vụ nền tảng để
đảm bảo khả năng chịu lỗi trong các
hệ thống phân tán, các
tiến trình trong nhòm phải có khả năng phát hiện
kịp thời những tiến trình nào đang bị lỗi
hoặc có khả năng gây ra lỗi, từ đó thông báo
đến các thành phần khác có liên quan hoặc thông báo cho
người quản trị hệ thống. Việc phát
hiện lỗi có thể dựa trên các thông tin trạng
thái, ngưỡng giới hạn
hoặc các tiến trình sử dụng kỹ thuật trí
tuệ nhân tạo, khi có lỗi xảy ra cần phải
thực hiện các thao tác trong qui trình sửa lỗi. Để phát hiện
lỗi của các tiến trình, chỉ cần sử dụng
hai cơ chế chủ động hoặc thụ động,
trong cơ chế chủ động các tiến trình trong
nhóm gửi cho nhau thông điệp “IS ALIVE” và tất nhiên sẽ
chờ đợi phản hồi từ các tiến trình
khác. Với cơ chế thụ động, mỗi tiến
trình sẽ chờ nhận
thông điệp từ các tiến tình khác, trong thực tế
thường dùng cơ chế chủ động.
Đã có nhiều
công trình nghiên cứu lý thuyết phát hiện lỗi, tựu
trung đều sử dụng cơ chế thời gian quá
hạn để kiểm tra xem một tiến trình có bị
lỗi hay không. Cơ chế này có hai điểm yếu
cơ bản, thứ nhất mạng không đáng tin cậy
và thứ hai thời gian quá hạn chỉ là dữ liệu
thô. Khi gửi thông điệp đến tiến trình khác,
không thể vội vàng kết luận tiến trình đó
đã bị lỗi chỉ vì lý do không nhận được
phản hồi. Mỗi tiến trình cần thường
xuyên trao đổi thông tin với các tiến trình có liên quan,
phải phân biệt được lỗi mạng hay lỗi
trên mỗi nút mạng, bất kỳ thành viên nào phát hiện
được lỗi thì phải thông báo tới các nút có
liên quan.
Trong nhiều
trường hợp tính chịu lỗi trong hệ thống
phân tán tập trung vào các tiến trình lỗi, tuy nhiên
cũng cần phải chú ý đến các lỗi truyền
thông. Lỗi truyền thông có thể do mất kênh truyền,
thất lạc thông tin, quá thời gian, lặp thông điệp…,
trong thực tế khi xây dựng các kênh truyền thông tin cậy
tiêu điểm tập trung vào việc che giấu lỗi mất
kênh truyền và thất lạc thông tin. Để khắc
phục lỗi truyền thông, người ta thường
sử dụng phương pháp truyền thông tin điểm-điểm hoặc truyền thông theo nhóm, truyền
thông tin cậy điểm-điểm dựa trên các giao thức
truyền tin cậy, ví dụ sử dụng giao thức
TCP.
Trong hệ phân tán, truyền thông
điểm - điểm tin cậy được thiết
lập bằng cách sử dụng các giao thức truyền thông
tầng vận tải tin cậy, ví dụ giao thức TCP. Giao
thức TCP che giấu được lỗi bỏ sót
bằng cơ chế số tuần tự của đoạn
tin và thực hiện truyền lại, những lỗi
như vậy hoàn toàn trong suốt đối với máy
khách. Tuy nhiên, sử dụng giao thức truyền thông tin
cậy không khắc phục được lỗi sụp
đổ, lỗi này xuất hiện khi liên kết TCP
đột ngột bị ngắt và các thông điệp
không thể tiếp tục gửi qua kênh truyền, thông
thường máy khách sẽ nhận được thông báo
lỗi kênh truyền. Khi hệ thống gặp lỗi
sụp đổ thì liên kết TCP sẽ bị hủy
bỏ, cách duy nhất là hệ thống tự động
tạo một liên kết mới bằng cách gửi yêu
cầu thiết lập lại liên kết.
Gọi thủ tục từ xa là một
trong những phương pháp sử dụng phổ biến
trong mô hình truyền thông khách/chủ, nó che giấu quá trình
truyền thông bằng cách làm cho việc gọi thủ
tục từ xa giống như gọi trên máy cục
bộ. Nếu máy khách, máy chủ và môi trường
mạng vận hành bình thường thì gọi thủ
tục từ xa thực hiện rất tốt vai trò
của nó, tuy nhiên vấn đề sẽ phát sinh khi
một trong ba thành phần trên gặp lỗi và tất nhiên
việc che giấu lỗi sẽ không thể thực
hiện được nữa, gọi thủ tục
từ xa gồm nhiều công đoạn và có thể
xảy ra các lỗi sau:

Hình 7.6 Những khả
năng lỗi khi gọi thủ tục từ xa
-
Máy khách không thể xác định
được máy chủ: Nguyên nhân gây lỗi có thể do
máy chủ và máy khách dùng các phiên bản khác nhau hoặc do
chính máy chủ bị lỗi. Khắc phục bằng cách
sử dụng tính năng phát hiện lỗi trong ngôn
ngữ lập trình ứng dụng, tuy nhiên không phải ngôn
ngữ nào cũng hỗ trợ phát hiện lỗi, nếu
tự viết một ngoại lệ hay điều
khiển tín hiệu thì sẽ phá hủy tính trong suốt.
-
Mất thông điệp yêu cầu từ
máy khách gửi đến máy chủ: Đây là loại
lỗi dễ xử lý nhất, hệ điều hành hay Stub
của máy khách kích hoạt một bộ đếm thời
gian khi gửi đi một yêu cầu, nếu bộ
đếm thời gian đã trở về giá trị 0 mà vẫn
không nhận được thông điệp phản
hồi từ máy chủ thì nó sẽ gửi lại yêu
cầu đó. Nếu máy khách nhận thấy có quá nhiều
yêu cầu phải gửi lại thì nó sẽ xác nhận
rằng máy chủ không hoạt động và sẽ quay
lại thành kiểu lỗi "không xác định
được máy chủ"
-
Máy chủ bị lỗi: sau khi nhận
được yêu cầu từ máy khách, máy chủ sẽ
thực hiện yêu cầu và trả kết quả thực
hiện cho máy khách, như vậy có thể xảy ra ba tình
huống sau:
o
Máy chủ đã nhận được yêu
cầu nhưng chưa thực hiện thì gặp lỗi
o
Máy chủ đang thực hiện yêu
cầu thì gặp lỗi
o
Máy chủ thực hiện xong yêu cầu
nhưng chưa gửi kết quả về cho máy khách thì
gặp lỗi.
Khi gặp lỗi
kiểu này, ở phía máy chủ sẽ thực hiện theo
ba chiến lược sau:
1.
Đợi đến khi nào máy chủ
hoạt động trở lại, nó sẽ cố thực
hiện yêu cầu đã nhận được
trước khi lỗi đó, như thế RPC thực
hiện ít nhất một lần.
2.
Máy chủ sau khi được khôi
phục nó sẽ không thực hiện yêu cầu nhận
được trước khi bị lỗi mà sẽ
gửi lại thông báo hỏng cho máy khách, với cách này thì
RPC thực hiện nhiều nhất một lần.
3.
Không thực hiện gì để
đảm bảo cả, nếu máy chủ bị lỗi
thì máy khách không hề hay biết, như vậy RPC có
thể được thực hiện nhiều lần
cũng có thể không thực hiện lần nào.
Máy khách có thể thực
hiện theo 4 chiến lược sau:
1.
Máy khách không thực hiện gửi lại
các yêu cầu vì thế không biết bao giờ yêu cầu
đó mới thực hiện được hoặc có
thể không bao giờ được thực hiện.
2.
Máy khách liên tục gửi lại yêu
cầu, như vậy có thể dẫn tới
trường hợp một yêu cầu được
thực hiện nhiều lần.
3.
Máy khách chỉ gửi lại yêu cầu nào
đó khi không nhận được thông điệp xác
nhận phản hồi từ máy chủ thông báo đã
nhận thành công. Trường hợp này, máy khách dùng bộ
đếm thời gian, sau một khoảng thời gian xác
định trước mà không nhận được xác
nhận thì sẽ gửi lại yêu cầu đó.
4.
Máy khách gửi lại yêu cầu nếu
nhận được thông báo lỗi từ máy chủ.
Với 3 chiến
lược trên máy chủ và 4 chiến lược của
máy khách sẽ cho 12 khả năng xảy ra, trong đó không
có một chiến lược riêng rẽ máy khách và máy
chủ cho kết quả tốt, như vậy cần
thiết phải phối hợp chiến lược
giữa máy khách và máy chủ.
|
Máy khách
|
Máy chủ
|
|
Thực
hiện lại
|
Không
thực hiện, gửi thông báo lỗi
|
Không
thực hiện
|
|
Không gửi
lại
|
Tốt
|
Không
thực hiện
|
Không
thực hiện
|
|
Liên tục
gửi lại
|
Lặp
|
Tốt
|
Tốt
|
|
Gửi lại
nếu không nhận được xác nhận
|
Lặp
|
Tốt
|
Tốt
|
|
Gửi lại
nếu nhận được thông báo lỗi
|
Không
xảy ra
|
Tốt
|
Không
xảy ra
|
Giả
sử ký hiệu M là sự kiện gửi thông điệp
trả về cho máy khách, P là sự kiện thực thi công
việc trong gọi thủ tục từ xa và C là sự kiện
lỗi xảy ra trên máy chủ. Khi nhận được
yêu cầu từ máy khách, máy chủ có thể thực
hiện trước sau đó mới thông báo cho máy khách và ký
hiệu là PàM hoặc thông báo
trước kết quả sau đó mới thực
thiện và ký hiệu là MàP, với ba sự
kiện trên sẽ có sáu trường hợp xảy ra
như sau:
MPC, PMC: Lỗi xảy ra
sau khi đã hoàn thành gửi thông điệp cho máy khách và
đã hoàn thành công việc xử lý.
MC(P): Lỗi xảy ra sau
khi đã hoàn thành gửi thông điệp cho máy khách nhưng
chưa hoàn thành công việc xử lý.
PC(M): Lỗi xảy ra khi
đã hoàn thành công việc xử lý nhưng chưa kịp
gửi thông điệp cho máy khách.
C(MP), C(PM): Lỗi xảy
ra khi chưa thực hiện xử lý và cũng chưa
gửi thông điệp cho máy khách
|
Máy khách
|
Máy chủ
|
|
MàP
|
PàM
|
|
MPC
|
MC(P)
|
C(MP)
|
PMC
|
PC(M)
|
C(PM)
|
|
Không gửi
lại
|
Tốt
|
Không
thực hiện
|
Không
thực hiện
|
Tốt
|
Tốt
|
Không
thực hiện
|
|
Liên tục
gửi lại
|
Lặp
|
Tốt
|
Tốt
|
Lặp
|
Lặp
|
Tốt
|
|
Gửi lại
nếu không nhận được xác nhận
|
Lặp
|
Tốt
|
Không
thực hiện
|
Lặp
|
Tốt
|
Không
thực hiện
|
|
Gửi lại
nếu nhận được thông báo lỗi
|
Tốt
|
Không
thực hiện
|
Tốt
|
Tốt
|
Lặp
|
Tốt
|
5.
Mất thông điệp phản hồi
từ máy chủ gửi kết quả cho máy khách: Máy khách đánh
số tuần tự cho các yêu cầu, máy chủ sẽ
nhận ra được đâu là yêu cầu đã
được gửi lại nhờ các số tuần
tự này, do đó máy chủ sẽ không thực hiện
lặp lại các yêu cầu. Tuy nhiên máy chủ vẫn
phải gửi trả về thông điệp thông báo yêu
cầu nào bị thất lạc hoặc có thể sử
dụng một bit ở phần thông tin điều
khiển của yêu cầu để phân biệt yêu cầu
nào là yêu cầu đã được gửi lại.
6.
Máy khách bị lỗi ngay sau khi gửi yêu
cầu tới máy chủ: Máy khách gửi yêu cầu tới
máy chủ rồi bị lỗi trước khi nhận
được trả lới từ máy chủ gửi
về, công việc mà máy chủ thực hiện nhưng
không có đích nào đợi để nhận kết
quả. Như vậy sẽ gây lãng phí thời gian xử lý
của CPU, trường hợp này có thể giải
quyết bằng bốn cách sau:
-
Cách 1: trước khi gửi đi yêu
cầu nào đó, stub của máy khách sẽ tạo ra một
bản ghi xác định công việc cần thực
hiện này và lưu nhật ký, sau khi phục hồi máy khách
sẽ lấy lại bản ghi đó và và việc thực
hiện công việc đã bị tạm dừng. Phương
pháp này có nhược điểm về chi phí trong việc
lưu lại mỗi bản ghi cho mỗi lời gọi
thủ tục từ xa.
-
Cách 2: chia thời gian hoạt động
liên tục của máy trạm thành các số liên tục
gọi là các thời kì. Mỗi khi các máy khách được
phục hồi thì tham số đó được tăng
thêm một đơn vị, máy trạm sẽ gửi thông
báo đến tất cả các máy khác thông báo số
thời kì mới của mình.
-
Cách 3: khi nhận được thông
điệp thông báo thời kì mới, mỗi máy chủ
sẽ kiểm tra xem mình có đang thực hiện một
tính toán từ xa nào hay không, nếu có sẽ cố xác
định xem máy khách nào đã gửi yêu cầu này, nếu
không xác định được thì quá trình tính toán này
sẽ bị hủy bỏ.
-
Cách 4: quy định mỗi RPC chỉ có
một khoảng thời gian xác định T để
thực hiện, sau khi gặp lỗi, máy khách sẽ
đợi thêm một khoảng thời gian T trước
khi thực hiện lại, vấn đế đặt ra
là phải lựa chọn giá trị khoảng thời gian T
như thế nào cho hợp lý.
Truyền thông nhóm tin cậy là phải có
cơ chế để đảm bảo thông điệp
đó đến được tất cả các thành viên
trong nhóm.
Nếu xảy ra lỗi thì sử dụng số tuần tự
các thông điệp để khắc phục, các thông điệp được lưu
tại một vùng đệm của bên gửi cho
đến khi nhận được bản tin xác nhận
từ tất cả các thành viên trong nhóm. Nếu bên nhận
xác định là bị mất một thông điệp nào
đó thì nó sẽ yêu cầu gửi lại. Thông
thường, bên gửi sẽ tự động gửi
lại thông điệp sau trong khoảng thời gian xác
định trước nếu không nhận
được thông điệp xác nhận.
Trong truyền thông nhóm tin cậy cơ
bản. quá trình truyền tin được thực
hiện theo cơ chế truyền thống, nghĩa là bên
gửi sẽ chuyển thông điệp đến tất
cả các thành viên trong nhóm và từng thành viên phải có trách
nhiệm phản hồi kết quả đã nhận được
thành công hay không, nếu có lỗi xảy ra thì áp dụng
cơ chế sửa lỗi như truyền thông
điểm – điểm.


Hình 7.7 Truyền thông nhóm tin cậy cơ
bản
Như vậy, nếu một tiến
trình nào đó trong nhóm yêu cầu gửi lại thì tất
cả các thành viên khác đều nhận lại thông
điệp mặc dù trước đó đã nhận thành
công, hơn nữa bên gửi sẽ phải tiếp
nhận phản hồi của tất cả các tiến
trình trong nhóm.
Để tăng hiệu năng khi làm
việc với nhóm có số lượng lớn các tiến
trình, mô hình truyền thông nhóm tin cậy mở rộng
tương tự như nguyên lý làm việc của giao
thức SRM (Scalable Reliable Multicasting): không trả về thông
điệp xác nhận thành công mà chỉ trả về thông
điệp NACK thông báo khi có lỗi truyền. Để có
thể thực hiện truyền thông nhóm tin cậy cho
một số lượng lớn các tiến trình thì tổ
chức các nhóm theo cấu trúc dạng cây, gốc là nhóm
chứa tiến trình gửi và các nút là các nhóm có chứa
tiến trình nhận. Việc chia thành các nhóm nhỏ hơn
cho phép sử dụng các kịch bản truyền thông nhóm
tin cậy cho từng nhóm, mỗi nhóm nhỏ sẽ
đề cử một tiến trình đóng vai trò
điều phối. Tiến trình điều phối có
khả năng điều khiển việc truyền
lại khi nhận được thông báo truyền lỗi.
Tiến trình điều phối của mỗi nhóm sẽ
có bộ đệm riêng, nếu không nhận
được thông điệp thì nó sẽ gửi yêu
cầu truyền lại tới tiến trình điều
phối cấp cao hơn.
Trong qui định của truyền
số liệu tin cậy sử dụng thông điệp xác
nhận, khi tiến trình điều phối nhận thành
công một thông điệp nó sẽ gửi thông
điệp xác nhận tới tiến trình điều
phối cấp cao hơn. Nếu tiến trình điều
phối của một nhóm nhận được thông
điệp xác nhận thành công việc chuyển thông
điệp của tất cả các tiến trình trong nhóm
gửi về thì nó sẽ xóa thông điệp khỏi
bộ đệm của nó. Phương pháp phân cấp nảy
sinh vấn đề xây dựng cấu trúc cây, rất
nhiều trường hợp yêu cầu cây phải có
cấu trúc động nên phải có một cơ chế
tìm đường cho cây. Khi một tiến trình muốn
gửi thông điệp cho một tập các tiến trình
khác theo dạng nhóm, nó sẽ không gửi thông điệp
tới tất cả các tiến trình của nhóm mà chỉ
gửi đến một nhóm nhỏ các tiến trình
cần nhận thông điệp đó. Vấn đế
đặt ra là phải đảm bảo gửi
được thông điệp tới tất cả các
tiến trình trong nhóm hoặc không được gửi
tới bất kì tiến trình nào nếu một tiến
trình trong nhóm bị lỗi.
Truyền tin nhóm tin cậy cơ bản
sẽ có hiệu năng thấp đối với các
hệ thống lớn, giả sử phải gửi thông
điệp đến N thành viên, khi đó bên gửi sẽ
nhận được ít nhất N phản hồi từ
các thành viên trong nhóm. Một giải pháp cải tiến có
thể thực hiện bằng cách bên nhận không cần
phải gửi phản hồi cho tất cả các thông
điệp mà chỉ thông báo những thông điệp còn
thiếu, do đó bên gửi phải lưu toàn bộ các
thông điệp đã gửi. Để giảm thiểu
số lượng phản hồi từ các thành viên
nhận người ta đã áp dụng hai giải pháp:
phản hồi không phân cấp và phản hồi có phân
cấp.

Hình 7.8 Phản hồi
không phân cấp
Giải pháp phản
hồi không phân cấp giảm số lượng phản
hồi đến bên gửi bằng cách sử dụng giao
thức SRM (Scalable Reliable Multicasting) do Floyd đề
xuất năm 1997. Bên nhận không phản hồi thông
điệp ACK để xác
nhận đã nhận thành công, nếu phát hiện thiếu
thông điệp phản hồi cho bên gửi và toàn bộ
thành viên trong nhóm thông điệp NACK, nghĩa là chưa
nhận được thông điệp hoặc thông
điệp bị lỗi. Để giảm hơn nữa
số lượng phản hồi NACK, giao thức vận
dụng phương pháp tự triệt tiêu thông
điệp NAC. Ví dụ, nếu một thành viên dự
định phản hồi NACK nó sẽ chờ một
thời gian nhất định, nếu không nhận
được NACK tương ứng với thông
điệp đó thì mới gửi các thành viên khác trong nhóm
và bên gửi. Giao thức này đảm bảo chỉ
phải gửi lại 01 thông điệp bị mất
phụ thuộc vào việc lập lịch thông điệp
phản hồi tại mỗi trạm nhận, nếu không
cùng một thời điểm sẽ có nhiều trạm
nhận gửi thông điệp NACK. Việc thiết lập
thời gian trên toàn nhóm là điều không dễ dàng, bắt
buộc mọi thành viên trong nhóm đều phải nhận
thông điệp NACK ngay cả khi không cần thiết.
Để khác phục vấn đề này, có thể tạo
thêm một nhóm mới phục vụ cho thông điệp
NACK, điều này rất khó quản lý trong mạng qui mô
lớn. Giải pháp cải tiến giao thức SRM cũng
mang lại hiệu quả lớn, các thành viên trong nhóm
hỗ trợ nhau phục hồi những thông điệp
bị mất trước khi chuyển thông điệp NACK
cho bên gửi.

Hình 7.9 Điều
khiển phản hồi phân cấp
Thay
vì truyền thông cậy cho một nhóm lớn các tiến
trình, điều khiển phản hồi phân cấp
được tổ chức lại các nhóm nhỏ
hơn theo cấu trúc hình cây, trong đó gốc là nhóm chứa
tiến trình gửi và các nút là các nhóm có chứa tiến
trình nhận. Mỗi nhóm bầu chọn tiến
trình điều phối có nhiệm vụ xử lý các yêu cầu
truyền lại. Tiến trình điều phối của mỗi
nhóm sẽ có bộ đệm riêng, nếu không nhận
được thông điệp thì sẽ gửi yêu cầu
truyền lại tới tiến trình điều phối
của nút cha. Đối với các thành viên trong nhóm có
thể sử dụng kịch bản truyền nhóm cơ
bản hoặc phản hồi không phân cấp. Việc xây dựng cấu trúc cây khá phức tạp, nhiều
trường hợp yêu cầu cây phải có cấu trúc
động nên phải có một cơ chế tìm đường.
Một yêu cầu quan trọng của
giao tác phân tán là phải đảm bảo tính nguyên tử,
nghĩa là các lệnh trong giao tác phải được
thực thi thành công trên tất cả các thành viên trong nhóm,
nếu có bất kỳ thành viên nào thực hiện không
thành công thì các thành viên khác cũng phải hủy bỏ giao
tác, đặc tính này có thể đạt được
bằng cách cài đặt giao thức khẳng định
nguyên tử (ACP – Atomic Commit Protocol). Việc cài đặt
giao thức ACP có thể thực hiện một pha, hai pha
…., số pha thực hiện càng nhiều thì tính chính xác càng
cao nhưng đổi lại hiệu năng của hệ
thống có thể bị suy giảm.
Giao thức khẳng định một
pha giảm độ phức tạp của cả thông
điệp lẫn nhật ký sự kiện dựa trên
giả thiết tất cả các thành viên đều
thực hiện thành công giao tác. Giao thức khẳng
định một pha thực hiện bầu chọn không
tường minh và nhật ký điều phối coi mỗi
hoạt động của giao tác đều
được xác nhận trong mỗi thành viên. Thao tác xác
nhận trong các giao thức này không chỉ có ý nghĩa thông
báo giao tác đã bảo toàn sự cách ly và các thuộc tính
không phân tầng mà còn cho biết giao tác không vi phạm
bất kỳ ràng buộc nhất quán nào của mỗi bên
tham gia.
Mô hình thiết lập khẳng định phải là mô hình phân cấp và tiến
trình điều phối đảm nhận nhiệm vụ
khẳng định. Trong khẳng định một
pha, tiến trình điều phối thông báo với tất
cả các thành viên còn lại hoặc là thực hiện
hoặc là hủy một thao tác nào đó. Nếu thành viên
nào đó không thực hiện được cũng không
thể báo lại cho tiến trình điều phối
biết, do đó không nên áp dụng cho các hệ thống
đòi hỏi tính nhất quán cao.
Xét một giao tác phân tán với các thành
viên là một tập các tiến trình chạy ở một máy
khác và không có lỗi xảy ra, giao thức khẳng
định hai pha gồm pha biểu quyết và pha quyết
định. Pha biểu quyết thực hiện hai
bước, tiến trình điều phối gửi
một thông điệp cầu biểu quyết VOTE_REQUEST
tới tất cả các thành viên trong nhóm. Sau khi nhận
được thông điệp VOTE_REQUEST, nếu có thể
thực hiện được thì thành viên đó sẽ
gửi lại cho tiến trình điều phối thông báo
chấp nhận biểu quyết VOTE_COMMIT, nếu không
sẽ gửi lại thông báo từ chối VOTE_ABORT. Pha
quyết định cũng thực hiện hai
bước, tiến trình điều phối tập
hợp tất cả các biểu quyết của các thành
viên, nếu tất cả đều chấp nhận giao
dịch thì nó sẽ gửi một thông điệp
GLOBAL_COMMIT tới tất cả các thành viên, chỉ cần
một thành viên gửi thông báo từ chối thì tiến
trình điều phối quyết định hủy giao
dịch trên và sẽ gửi một thông điệp
GLOBAL_ABORT cho tất cả các thành viên trong nhóm.

Hình 7.10 Giao thức khẳng định
hai pha
Các thành viên sau khi đã gửi thông báo
chấp nhận cam kết sẽ đợi phản
hồi từ tiến trình điều phối, nếu nhận
được thông báo GLOBAL_COMMIT thì giao tác sẽ
được chấp thuận, còn nếu nhận
được GLOBAL_ABORT thì giao tác sẽ bị hủy
bỏ. Giao thức khẳng định hai pha đảm
bảo tính nguyên tử và phục hồi độc lập
nhưng chi phí đáng kể khi thực hiện giao tác bình
thường, điều đó ảnh hưởng bất
lợi tới hiệu năng của hệ thống. Nguyên
nhân là do chi phí phải trả vì sự phức tạp trong
trao đổi thông điệp, một lượng lớn
thông điệp dùng cho việc điều phối thao tác
trên các nút khác nhau và sự phức tạp của nhật ký
ghi lại các thao tác trên từng nút.
Nhược điểm chính của giao
thức khẳng định hai pha là tốn nhiều
thời gian chờ đợi, cả tiến trình
điều phối lẫn các thành viên còn lại
đều phải chờ một thông điệp nào đó
được gửi đến, nếu tiến trình
điều phối bị lỗi thì hoạt động
của cả hệ thống sẽ bị ảnh
hưởng. Giao thức khẳng định hai pha vận
hành theo nguyên lý phong tỏa, nếu tiến trình điều
phối bị lỗi thì các thành viên không thể đạt
được quyết định cuối cùng. Để
khắc phục nhược điểm của cam kết
hai pha trong trường hợp tiến trình điều
phối bị lỗi, Skeen đã đề xuất giao
thức cam kết ba pha, các trạng thái trong cam kết ba
pha khá giống cam kết hai pha nhưng thêm một trạng
thái tiền khẳng định PRECOMMIT. Mặc dù giao
thức khẳng định ba pha được
đề cập đến rất nhiều trong các tài
liệu nghiên cứu nhưng nó lại ít được
sử dụng trong thực tế bởi vì hiện
tượng phong tỏa trong giao thức cam kết hai pha
rất ít khi xảy ra.

(a) (b)
Hình 7.11 Giao thức
khẳng định ba pha
(a) Máy trạng thái hữu hạn
của thành phần điều phối
(b) Máy trạng thái hữu hạn
của thành viên
Giống như giao
thức khẳng định hai pha, giao thức khẳng
định ba pha cũng gồm nhiều tiến trình trong
đó có một tiến trình đóng vai trò điều
phối, máy trạng thái hữu hạn của các tiến
trình thể hiện trên hình 7.11. Bản chất của giao
thức khẳng định ba pha thể hiện ở
chỗ các trạng thái của thành phần điều
phối và các thành viên tham gia đáp ứng hai điều
kiện sau:
1.
Không có một trạng thái đơn
lẻ nào mà từ đó có thể chuyển trực
tiếp sang trạng thái khẳng định hoặc
hủy bỏ.
2.
Không có trạng thái mà trong đó không
thể đưa ra quyết định cuối cùng,
và từ đó có thể chuyển sang trạng thái khẳng
định.
Hai điều kiện
trên là cần thiết và đủ để đảm
bảo giao thức khẳng định ba pha có thể
hoạt động trong chế độ không phong tỏa.
Thành phần điều phối trong giao thức khẳng
định ba pha bắt đầu bằng việc gửi
thông điệp yêu cầu bỏ phiếu (Vote-Request)
đến tất cả các thành viên khác, sau đó sẽ
chờ phản hồi từ các thành viên này. Chỉ cần
1 tiến trình bỏ phiếu hủy bỏ (ABORT) hoặc
một tiến trình thành viên nào đó không phản hồi
thì quyết định cuối cùng cũng sẽ là hủy
bỏ, như vậy tiến trình điều phối
sẽ gửi thông điệp hủy bỏ toàn cục
(Global Abort) đến tất cả các tiến trình thành
viên. Nếu tất cả các tiến trình thành viên
đều phản hồi phiếu bầu đồng ý
khẳng định, chắc chắn tất cả các
tiến trình thành viên đã ở trạng thái sẵn sàng
khẳng định (READY), nghĩa là giao tác có cơ
hội được khẳng định, tiến trình
điều phối sẽ gửi thông điệp chuẩn
bị khẳng định (Prepare commit) đến tất
cả các thành viên. Nếu tại thời điểm này
tiến trình điều phối bị lỗi thì sẽ
không có một thông điệp nào đươc gửi
đến các tiến trình thành viên, sau một thời gian
nhất định từng tiến trình thành viên sẽ
không được phép hủy bỏ hay khẳng
định giao tác, mỗi thành viên áp dụng điều
kiện thứ nhất nên chúng phải tham khảo
trạng thái của các thành viên khác, tất cả
đều ở trạng thái quá hạn chờ thông
điệp chuẩn bị khẳng định, do đó
giao tác sẽ tự động bị hủy. Nhận
được thông điệp chuẩn bị khẳng
định từ tiến trình điều phối, các
tiến trình thành viên sẽ phản hồi. Sau khi đã
nhận được phản hồi từ tất
cả các tiến tình thành viên, tiến trình điều
phối sẽ gửi thông điệp khẳng định
toàn cục (Global commit), nhận được thông
điệp này các tiến trình thành viên sẽ thực
hiện khẳng định giao tác, như vậy giao tác
phân tán đã hoàn thành trên tất cả các thành viên của
hệ thống.
Xảy ra tình huống
một thành viên nào đó bị lỗi nên không có phản
hồi, như vậy tiến trình điều phối
bị phong tỏa ở trạng thái chuẩn bị
khẳng định, nó biết chắc chắn tiến
trình thành viên lỗi đã biết giao tác đang chờ để
được khẳng định, tiến trình điều phối
có thể ra lệnh một cách an toàn cho những thành viên
đang hoạt động bằng cách gửi thông
điệp khẳng định toàn cục cho nhóm các
tiến trình tham gia. Ngoài ra, tiến trình điều
phối dựa vào giao thức phục hồi để các
tiến trình lỗi có thể thực hiện khẳng
định cho các giao tác khi chúng phục hồi trở
lại.
Nếu tiến trình thành
viên ở trạng thái READY, quá thời gian qui định mà
vẫn không nhận được thông điệp
chuẩn bị khẳng định, nó sẽ liên lạc
với tiến trình thành viên khác, nếu trạng thái
của tiến trình thành viên được hỏi là ABORT
thì nó sẽ hủy bỏ giao tác, nếu là PRECOMMIT thì
sẽ chuyển trạng thái của nó giống như thành
viên đã hỏi, nếu là COMMIT thì sẽ thực hiện
khẳng định giao tác. Nều thành viên ở trạng
thái PRECOMMIT, quá thời gian qui định mà vẫn không
nhận được thông điệp khẳng
định toàn cục, nó sẽ liên lạc với tiến
trình thành viên khác, nếu trạng thái của tiến trình thành
viên được hỏi là COMMIT thì nó thực hiện
khẳng định giao tác, nếu tất cả các
tiến trình thành viên đều ở trạng thái PRECOMMIT
thì nó cũng thực hiện khẳng định giao tác.
Lỗi có thể xảy
ra ở bất kỳ thời điểm nào, một
hệ thống đáng tin cậy phải không những có
khả năng phát hiện lỗi mà còn phải biết
phục hồi sau khi gặp lỗi, nói cách khác phục
hồi là các biện pháp đưa
hệ thống từ trạng thái bị lỗi
trở về trạng thái không lỗi.
Có hai cách tiếp cận phục hồi
lỗi, phục hồi lùi và phục hồi tiến, tư
tưởng của phương pháp phục hồi lùi là
đưa hệ thống từ trạng thái lỗi ở
thời điểm hiện tại về trạng thái không
lỗi ở thời điểm trước khi xảy ra
lỗi. Để làm được điều đó
cần phải liên tục ghi lại trạng thái của
hệ thống và khi hệ thống gặp lỗi sẽ chuyển
về trạng thái đã sao lưu, thời điểm
hệ thống thực hiện sao lưu dữ liệu và
trạng thái gọi là điểm kiểm tra. Khác với
phục hồi lùi, phục hồi tiến không đưa
hệ thống trở lại trạng thái không lỗi
trước khi xảy ra lỗi mà chuyển hệ
thống sang trạng thái mới không lỗi để có
thể tiếp tục hoạt động. Khó khăn
lớn nhất của giải pháp này là phải biết
trước những lỗi nào có thể xảy ra, chỉ
khi đó mới có thể sửa lỗi và chuyển sang
trạng thái mới. Có thể dễ dàng giải thích
sự khác biệt giữa phục hồi tiến và
phục hồi lùi khi xem xét cài đặt truyền thông tin
cậy. Khi phát hiện thấy một đoạn tin
bị lỗi, bên nhận sẽ yêu cầu bên gửi
phải gửi lại đoạn tin đó, nghĩa là
hệ thống đã chuyển về trạng thái
trước khi gửi đoạn tin lỗi, đó là cách
thể hiện của phục hồi lùi. Một giải
pháp khác là sử dụng mã sửa chữa (Erasure Code),
giả sử cần phải gửi k đoạn tin, bên
gửi sẽ mã hóa thành n đoạn tin gọi là khối
mã sửa chữa (n, k), chỉ cần nhận đủ k
đoạn tin mã hóa sẽ có thể phục hồi lại
được k đoạn tin nguyên gốc, nếu
chưa đủ số lượng đoạn tin thì
vẫn tiếp tục phải gửi cho đến khi
dựng lại được các đoạn tin đã
thất lạc.
Nói chung, kỹ thuật phục hồi
lỗi lùi được sử dụng rộng rãi như
một cơ chế tổng quát về phục hồi
lỗi trong các hệ thống phân tán, ưu điểm
của nó là tính độc lập với các tiến trình và
như vậy có thể tích hợp vào tầng trung gian của
hệ thống phân tán như một dịch vụ đa
năng. Tuy nhiên phục hồi lùi cũng bộc lộ
một số vấn đề, việc phục hồi
hệ thống về trạng thái trước sẽ
đòi hỏi chi phí tương đối lớn về
hiệu năng, cách đơn giản để thoát
khỏi vấn đề này là tạo ra cơ chế ít
tốn kém bằng cách khởi động lại các thành
phần. Cơ chế phục hồi lùi độc lập
với các ứng dụng phân tán, không có gì đảm
bảo sau khi phục hồi lỗi tương tự
lại không lặp lại và như vậy có thể
xảy ra vòng lặp phục hồi. Cuối cùng, dựa
vào cơ chế điểm kiểm tra nhưng không
phải lúc nào cũng có thể phục hồi về
trạng thái trước khi xảy ra lỗi, ví dụ
trường hợp các máy trả tiền tự
động, sau khi máy đã nhả tiền thì khó có thể
rút lại được.
Thực hiện điểm kiểm tra
là thao tác làm suy giảm đáng kể hiệu năng
của hệ thống, do đó nhiều hệ thống
phân tán có khả năng chịu lỗi kết hợp
điểm kiểm tra với việc ghi nhật ký thông
điệp, tiến trình gửi sẽ ghi nhật ký thông
điệp trước khi gửi và tiến trình nhận
sẽ ghi nhật ký thông điệp trước khi
chuyển lên tầng ứng dụng để thực
hiện. Nếu tiến trình nhận gặp lỗi,
tiến trình gửi chỉ việc phục hồi về
trạng thái của điểm kiểm tra sau và lấy các
thông điệp trong nhật ký kể từ thời
điểm thực hiện điểm kiểm tra
để gửi lại, như vậy có thể giãn
tần suất thực hiện các điểm kiểm tra
và vì vậy sẽ giảm thiểu ảnh hưởng
tới hiệu năng của hệ thống.
Để phục hồi về
trạng thái không lỗi thì dữ liệu phải
được lưu trữ an toàn, dữ liệu không
bị hỏng hóc ngay cả khi tiến trình bị sụp
đổ hoặc ngay cả khi phương tiện lưu
trữ bị lỗi. Dữ liệu thường
được lưu trữ ở bộ nhớ RAM
hoặc ổ đĩa cứng, nếu lưu trữ trong
RAM thì sẽ bị mất khi mất điện hoặc
khi máy tính gặp lỗi. Dữ liệu trên ổ
đĩa cũng có thể bị lỗi, vì vậy cần
thiết phải sử dụng kỹ thuật RAID
để nhân bản trên nhiều ổ đĩa, thậm
chí cần phải xây dựng chính sách sao lưu dữ
liệu sang các máy tính khác.
Trong hệ thống phân tán có khả
năng chịu lỗi, phục hồi lùi đòi hỏi
hệ thống phải đều đặn ghi lại
trạng thái của nó vào vùng nhớ vĩnh cửu,
đặc biệt phải ghi được trạng thái
toàn cục nhất quán gọi là bản sao phân tán (snapshot). Trong
bản sao phân tán, nếu một tiến trình nào đó ghi
nhật ký nhận được bản tin thì chắc
chắn tiến trình gửi cũng sẽ phải ghi
nhật ký gửi bản tin đó, nếu có lỗi xảy
ra thì các tiến trình này biết được sẽ
phải bắt đầu từ đâu để phục
hồi hệ thống.

Hình 7.12 Phục hồi lùi sử dụng
trạng thái toàn cục nhất quán
Trong các lược đồ phục
hồi lùi, mỗi tiến trình đều đặn ghi
trạng thái của nó vào bộ nhớ cục bộ
vĩnh cửu. Để phục hồi sau khi xảy ra
lỗi, cần thiết phải dò tìm trạng thái nhất
quán toàn cục từ những trạng thái cục bộ
này, tốt nhất là phục hồi về bản sao phân
tán gần nhất và gọi là đường phục hồi,
nói cách khác đường phục hồi tương
ứng với tập các điểm kiểm tra nhất
quán gần nhất.
Việc thực hiện điểm
kiểm tra trong các hệ thống phân tán thông thường
mang tính chất cục bộ, mỗi tiến trình
đều đặn ghi trạng thái cục bộ của
theo cách riêng biệt, điều đó sẽ gây khó khăn
cho việc xác định đường phục hồi.
Để tìm ra đường phục hồi mỗi
tiến trình sẽ phải quay lui về trạng thái
gần nhất đã đươc ghi lại, nếu các
trạng thái cục bộ này không tạo nên
được đường phục hồi thì tiếp
tục phải quay lui về trạng thái trước
nữa, quá trình phục hồi phân tầng này có thể
dẫn đến hiện tượng dây chuyền.

Hình 7.13 Hiệu ứng dây chuyền trong
phục hồi lùi
Hình 7.13 cho thấy, khi tiến trình P2
gặp lỗi thì cần phải phục hồi trạng
thái của nó về điểm kiểm tra gần nhất,
tiến trình P1 cũng sẽ phải quay lui về trạng
thái của điểm kiểm tra gần nhất. Rất
tiếc hai trạng thái gần nhất được
lưu cục bộ này không hình thành trạng thái toàn
cục nhất quán, tiến trình P2 ghi nhật ký đã
nhận được thông điệp m2 nhưng nhật
ký của tiến trình P1 lại không ghi nhận đã
gửi thông điệp m2. Như vậy tiến trình P2
lại phải quay lui về trạng thái trước
nữa, nhưng ở trạng thái này lại không fhi
nhận đã gửi thông điệp m1 trong khi nhật ký
của tiến trình P1 cho thấy đã nhận
được thông điệp m1, tiến trình P1 lại
quay lui về trạng thái trước nữa, cứ
như vậy cả hai tiến trình phải quay lui về
trạng thái ban đầu mới tìm thấy
đường phục hồi.
Các tiến trình thực hiện
điểm kiểm tra cục bộ độc lập
với nhau gọi là phương pháp điểm kiểm
tra độc lập, một giải pháp khác là phối
hợp điểm kiểm tra toàn cục, nó đòi hỏi
phải có sự đồng bộ trên tất cả các
tiến trình và như vậy sẽ làm suy giảm hiệu
năng hệ thống. Một
nhược điểm khác nữa của điểm
kiểm tra độc lập còn thể hiện khi dọn
dẹp không gian lưu trữ cục bộ, tuy nhiên
nhược điểm chính vẫn là vấn đề xác
định đường phục hồi. Cài đặt
điểm kiểm tra độc lập đòi hỏi
phải ghi lại những phụ thuộc để các
tiến trình có thể cùng nhau quay lui về trạng thái toàn
cục nhất quán. Giả sử CPi(m) là
điểm kiểm tra thứ m của tiến trình Pi,
INTi(m) là khoảng thời gian giữa hai
điểm kiểm tra CPi(m-1) và CPi(m). Khi
tiến trình Pi gửi thông điệp trong
khoảng thời gian INTi(m),
nó gắn kèm thông điệp cặp (i,m). Tiến trình Pj
nhận được thông điệp với cặp
đính kèm (i,m) trong khoảng
thời gian INTj(n), nó ghi nhận phụ
thuộc INTi(m) à INTj(n), khi thực hiện
điểm kiểm tra CPj(n) nó cũng ghi nhật ký
sự phụ thuộc này. Khi tiến trình Pi quay lui
về điểm kiểm tra CPi(m-1) thì cần
phải đảm bảo rằng tất cả các
tiến trình đã nhận được thông điệp
từ Pi trong khoảng thời gian INTi(m)
cũng phải quay lui về điểm kiểm tra
trước khi nhận được các thông điệp
đó. Như vậy tiến trình Pj sẽ phải
quay lui về điểm kiểm tra CPj(n-1), nếu
vẫn chưa đạt được trạng thái
nhất quán toàn cục thì tiếp tục phải quay lui
về điểm kiểm tra trước nữa. Việc
tính toán đường phục hồi đòi hỏi
phải phân tích những phụ thuộc đã ghi nhận
trong mỗi tiến trình khi thực hiện điểm
kiểm tra, không cần phải đi sâu thêm về vấn
đề này cũng thấy công việc này phức tạp
thế nào và điều đó cho thấy sự cần
thiết phải thực hiện điểm kiểm tra
phối hợp. Vì vậy kỹ thuật thực hiện
điểm kiểm tra phối hợp đã
được ứng dụng rộng rãi, đặc
biệt đối với các hệ thống có qui mô
lớn.
Trong kỹ thuật điểm kiểm
tra phối hợp, tất cả các tiến trình
đồng bộ với nhau để cùng thực
hiện việc ghi trạng thái vào bộ nhớ lưu
trữ ổn định cục bộ, ưu điểm
chính của nó là các trạng thái cục bộ đã tự
hình thành tính nhất quán toàn cục, như vậy sẽ
tránh được hiệu ứng quay lui dây chuyền.
Giải thuật ảnh phân tán được sử
dụng để phối hợp thực hiện
điểm kiểm tra, đó là ví dụ về việc
phối hợp điểm kiểm tra không phong tỏa.
giải pháp đơn giản hơn là sử dụng giao
thức phong tỏa hai pha, tiến trình điều phối
gửi thông điệp yêu cầu thực hiện
điểm kiểm tra CHECKPOINT_REQUEST đến tất
cả các tiến trình, nhận được thông
điệp này các tiến trình sẽ thực hiện
điểm kiểm tra cục bộ và gửi thông
điệp xác nhận đã hoàn thành cho tiến trình điều
phối, tất cả các thông điệp nhận
được sau đó hoặc những thông điệp
cần gửi đều chuyển vào hàng đợi cho
đến khi nhận được thông điệp hoàn
thành điểm kiểm tra CHECKPOINT_DONE từ tiến trình
điều phối. Sau khi nhận được thông
điệp xác nhận từ tất cả các tiến trình
đã hoàn thành thực hiện điểm kiểm tra,
tiến trình điều phối sẽ gửi thông
điệp CHECKPOINT_DONE đến tất cả các
tiến trình thành viên để các tiến trình đó có
thể tiếp tục thực hiện công việc của
mình.
Có thể cải tiến giải
thuật này bằng cách chỉ gửi thông điệp yêu
cầu điểm kiểm tra
đến các tiến trình phụ thuộc vào phục
hồi của thành phần điều phối, bỏ qua
các tiến trình khác. Một tiến trình được
gọi là phụ thuộc khi nó nhận được thông
điệp trực tiếp hoặc gián tiếp có quan
hệ nhân quả với thông điệp đã nhận
được từ tiến trình điều phối
kể từ khi thực hiện điểm kiểm tra
cuối cùng, điều này dẫn tới khái niệm
ảnh lũy tiến. Để thực hiện ảnh
lũy tiến, tiến trình điều phối chỉ
gửi thông điệp CHECKPOINT_REQUEST đến các
tiến trình đã nhận được thông điệp
của nó từ thời điểm thực hiện
điểm kiểm tra cuối cùng, tiến trình Pi
nhận được thông điệp này sẽ làm
tương tự bằng cách gửi thông điệp
CHECKPOINT_REQUEST đến các tiến trình khác có liên quan
đến nó, quá trình này chỉ được phép thực
hiện một lần. Sau khi các tiến trình đã hoàn thành
thực hiện điểm kiểm tra cục bộ,
tiến trình điều phối sẽ gửi thông
điệp thứ hai CHECKPOINT_DONE để các tiến
trình có liên quan tiếp tục thực hiện công việc
của mình.
Thực hiện điểm kiểm tra
đòi hỏi ghi trạng thái vào bộ nhớ ổn
định, vì vậy cần
giảm số lần thực hiện điểm
kiểm tra nhưng vẫn phải đảm bảo
khả năng phục hồi, một trong những kỹ
thuật quan trọng được áp dụng trong hệ
thống phân tán là ghi nhật ký thông điệp. Ý
tưởng cơ bản của kỹ thuật này dựa
trên giả thiết nếu thông điệp được
gửi lại thì có thể đạt được
trạng thái nhất quán toàn cục mà không cần phục
hồi về trạng thái lấy từ bộ nhớ
ổn định, thay vào đó trạng thái của
điểm kiểm tra được lấy từ
điểm khởi đầu và tất cả các thông
điệp từ điểm khởi đầu đó
sẽ được gửi lại và xử lý phù hợp.
Cách tiếp cận này hoạt
động tốt với giả thiết dựa trên mô
hình xác định từng phần, việc thực thi
của mỗi tiến trình là một chuỗi các khoảng
sự kiện, khoảng sự kiện bắt đầu từ
thời điểm xảy ra sự kiện không xác định
và kết thúc tại thời điểm của sự
kiện cuối cùng trước khi xảy ra sự
kiện không xác định kế tiếp. Nếu thực
hiện lại các khoảng sự kiện này sẽ
được kết quả tương ứng với
kết quả của những sự kiện không xác định,
như vậy việc ghi lại tất cả các sự
kiện không xác định chuyển thành có thể lặp
lại lại toàn bộ những thực thi của
tiến trình theo cách xác định.
Việc ghi nhật ký thông điệp là
cần thiết để phục hồi tiến trình
sụp đổ và như vậy sẽ phục hồi
được trạng thái toàn cục nhất quán,
điều quan trọng là phải biết chính xác khi nào các
thông điệp cần được ghi lại. Alvisi và Marzullo đã mô tả nhiều
lược đồ ghi nhật ký thông điệp,
mỗi thông điệp chứa thông tin điều
khiển để có thể được gửi lại
và xử lý chính xác. Thông tin điều khiển xác
định bên gửi và bên nhận, số tuần tự
để tránh trùng lặp, số thứ tự phân phát
để quyết định chính xác khi nào sẽ
được xử lý ở bên nhận. Một thông
điệp được coi là ổn định nếu
nó không bị thất lạc trên kênh truyền vì nó sẽ
được ghi vào bộ nhớ ổn định,
những thông điệp đó sẽ được
sử dụng để gửi lại khi cần thực
hiện phục hồi. Khi
một tiến trình nào bị sụp đổ, tiến
trình đó sẽ phải được phục hồi,
ngay cả khi phục hồi thành công cũng có thể
dẫn tới hiện tượng tiến trình mồ côi,
đó là những tiến trình sống sót sau sự sụp
đổ của tiến trình khác nhưng trạng thái của
nó không nhất quán với tiến trình sụp đổ và đã
được phục hồi, để làm rõ vấn
đề này cần phải phân tích chi tiết về quá
trình ghi nhật ký thông điệp.

Hình 7.14 Phát lại thông điệp không
chính xác sau khi phục hồi
Ví dụ trên hình 7.14, tiến trình Q nhận
thông điệp m1 tiến trình P và m2 từ tiến trình R,
thông điệp m1 có ghi nhật ký trong khi thông điệp
m2 không được ghi nhật ký, sau đó Q lại
gửi thông điệp m3 cho tiến trình R và thông
điệp này được ghi vào nhật ký. Sau khi
gửi thông điệp m3, tiến trình Q sụp đổ
do đó nó phải thực hiện quá trình phục hồi,
tiến trình Q lấy thông điệp từ nhật ký và
phục hồi thành công thông điệp m1 nhưng không
thể phục hồi thông điệp m2 vì thông
điệp này không được ghi trong nhật ký. Vì
thông điệp m3 phụ thuộc nhân quả vào thông
điệp m2, m2 không được phát lại thì Q
cũng sẽ không thực hiện gửi thông điệp
m3. Tiến trình R có bản sao thông điệp m3 nhưng
thông điệp này lại không có trong tiến trình Q sau khi phục hồi và như
vậy trạng thái của tiến trình Q không nhất quán
với tiến trình R, khi đó R được gọi là
tiến trình mồ côi.
Một cách tổng quát, mỗi thông
điệp m dẫn tới tập DEP(m) các tiến trình
phụ thuộc vào sự phân phát thông điệp m, nếu
một thông điệp m’ phụ thuộc nhân quả
với thông điệp m và
thông điệp m’ được phân phát đến
bất kỳ tiến trình nào thì tiến trình đó cũng
sẽ là thành viên của tập DEP(m). Thông điệp m’
phụ thuộc nhân quả vào m nếu nó được
gửi bởi một tiến trình trước đó đã
phân phát thông điệp m, hoặc m’ thuộc tiến trình
đã phân phát thông điệp khác nhưng thông điệp
đó phụ thuộc nhân quả vào thông điệp m.
Tập COPY(m) gồm các tiến trình nhận
được bản sao thông điệp m nhưng chưa
kịp ghi vào vùng nhớ ổn định. Khi một
tiến trình chuyển tiếp thông điệp m thì nó
cũng là thành viên của COPY(m), nếu tất cả các
tiến trình này sụp đổ thì rõ ràng việc phát
lại thông điệp m sẽ không thể thực
hiện được. Tiến trình mồ côi xuất
hiện khi nó phụ thuộc vào thông điệp nhưng
không có cách nào phát lại thông điệp đó.
Để tránh hiện tượng
tiến trình mồ côi thì cần phải chắc chắn
rằng mỗi tiến trình trong tập COPY(m) sụp
đổ thì không ở trong tập DEP(m) của tiến
trình sống sót, nghĩa là tất cả các tiến trình
trong DEP(m) cũng phải bị sụp đổ.
Điều kiện này có thể được thực
hiện nếu đảm bảo rằng mọi tiến
trình là thành viên của DEP(m) thì cũng là thành viên của
COPY(m), nói cách khác nếu một tiến trình phụ
thuộc thông điệp m thì nó phải giữ bản sao
của thông điệp m. Về cơ bản, có thể
giải quyết vấn đề tiến trình mồ côi
bằng cách sử dụng giao thức ghi nhật ký bi quan
hoặc lạc quan. Giao thức bi quan đảm bảo
rằng mỗi thông điệp chưa ổn định
thì chỉ có nhiều nhất một tiến trình phụ
thuộc vào nó, như vậy tiến trình sẽ chỉ
được phép gửi thông điệp khi tất
cả các thông điệp đã được ghi vào
bộ nhớ ổn định, nghĩa là tiến trình
đã thuộc tập COPY(m). Ngược lại, giao
thức ghi nhật ký lạc quan, công việc thực
tế được thực hiện sau khi xảy ra
sụp đổ, tiến trình mồ côi trong tập DEP(m)
sẽ quay lui cho đến khi không thuộc tập này nữa,
như vậy nó phải lưu vết các phụ thuộc
và vì vậy sẽ làm phức tạp hóa vấn đề
cài đặt. So sánh hai cách tiếp cận trên có thể
thấy cách tiếp cận bi quan đơn giản hơn
cách tiếp cận lạc quan rất nhiều, vì vậy
trong thực tế người ta thường sử
dụng cách tiếp cận bi quan.
CHƯƠNG 8:
NHẤT QUÁN
VÀ NHÂN BẢN
Để đảm bảo an toàn và nâng
cao hiệu năng cho hệ thống phân tán người ta
thường nhân bản dữ liệu, tuy nhiên khi tạo
nhiều bản sao sẽ nảy sinh vấn đề
về tính nhất quán. Điều này có nghĩa là khi
một bản sao được cập nhật thì các
bản sao khác cũng phải cập nhật theo, nếu
không các bản sao sẽ không giống nhau nữa. Nhân
bản dữ liệu để tăng độ tin
cậy và tính sẵn sàng của hệ thống, khi dữ
liệu bị lỗi hay vì một nguyên nhân nào đó mà không
thể dùng được thì có thể dùng ngay bản sao
dữ liệu để hệ thống không bị gián
đoạn và tránh sử dụng các dữ liệu không
chính xác. Nhân bản dữ liệu cũng nhằm mục
đích tăng hiệu năng của hệ thống và do
đó có thể tăng quy mô cả về số
lượng lẫn phạm vi địa lý.
Kỹ thuật nhân bản cũng đã
từng được áp dụng trong các hệ thống
độc lập, ví dụ hệ quản trị cơ
sở dữ liệu sao chép các bản ghi vào vùng đệm
nhằm tăng tốc độ đọc/ghi dữ
liệu. Trong hệ thống phân tán, dữ liệu
được nhân bản và đặt tại các máy chủ
sao cho giảm thiểu lượng thông tin lưu chuyển
trên mạng và quãng đường vận chuyển. Tuy
nhiên kỹ thuật nhân bản sẽ làm suy giảm của
tính nhất quán, có sự thay đổi trên một dữ
liệu mà không cập nhật kịp thời trên các
bản sao của nó, điều này có thể dẫn
đến những sai sót trong xử lý. Để
đảm bảo tính nhất quán có thể xuất phát
từ cách tiếp cận lấy dữ liệu làm trung tâm
hay cách tiếp cận lấy máy khách làm trung tâm.
Chương này sẽ giới thiệu chi tiết về
tính nhất quán khi nhân bản dữ liệu và các
phương pháp khác nhau để đạt
được mục đích này.
Chúng ta bắt đầu bằng cách thảo
luận lợi ích của việc nhân bản và mối liên
quan của nó tới qui mô của hệ thống phân tán, sau
đó sẽ tập trung phân tích tính nhất quán. Vấn
đề quan trọng trong các hệ thống phân tán là các
tiến trình đồng thời truy nhập đến
dữ liệu chia sẻ, tính nhất quán trong những
trường hợp này thể hiện những gì tiến tiến
trình mong đợi khi đọc và cập nhật dữ
liệu chia sẻ trong khi các tiến trình khác cũng
đang truy nhập dữ liệu đó. Các mô hình nhất
quán cho những dữ liệu chia sẻ thường khó
cài đặt hiệu quả trong những hệ thống
phân tán qui mô lớn, trong nhiều trường hợp các mô
hình đơn giản có thể sẽ được
sử dụng để dễ dàng cài đặt hơn. Ví
dụ, các mô hình lấy máy khách làm trung tâm tập trung
đảm bảo tính nhất quán dưới góc độ
của từng máy khách.
Định nghĩa tính nhất quán mới
chỉ là một nửa của vấn đề, cần
phải xem xét cách cài đặt thực tế như
thế nào, do đó phải giải quyết hai vấn
đề căn bản trong nhân bản. Thứ nhất
phải quản lý các bản sao, vấn đề không
phải chỉ quản lý vị trí của các bản sao mà
còn phải giải quyết vấn đề phân tán nội
dung đến các máy chủ đó. Vấn đề thứ
hai là bằng cách nào duy trì tính nhất quán của các bản
sao, trong nhiều trường hợp các ứng dụng yêu
cầu dạng nhất quán mạnh, nghĩa là các thao tác
cập nhật phải được lan tỏa ngay
lập tức đến các bản sao, nhiều giải
pháp cũng sẽ được đề cập
đến để thực hiện cài đặt
thực tế các mô hình nhất quán.
Có hai lý do phải nhân bản dữ liệu,
đó là tăng độ tin cậy và cải thiện
hiệu năng cho hệ thống. Với lý do thứ
nhất, nếu một bản sao bị lỗi thì hệ
thống vẫn có thể hoạt động sau khi
chuyển sang bản sao khác,
bằng cách duy trì nhiều bản sao có thể bảo
vệ dữ liệu tốt hơn đề phòng khi
xảy ra lỗi. Ví dụ nếu có ba bản sao dữ
liệu, mọi thao tác đọc và ghi đều thực
hiện trên các bản sao này thì có thể tự bảo
vệ khi một thao tác ghi bị lỗi bằng cách
lấy giá trị của hai bản sao còn lại. Một
cách tổng quát, dữ liệu được lưu trên N
bản sao, khi dữ liệu của một bản sao nào
đó bị lỗi thì hoàn toàn
có thể tin cậy dữ liệu của ít nhất N/2+1
bản sao không lỗi.
Lý do thứ hai cải thiện hiệu
năng khi mở rộng qui mô là hoàn toàn dễ hiểu, các
máy chủ bản sao được đặt ở
nhiều vị trí địa lý khác nhau và như vậy yêu
cầu của máy khách không bị tập trung về một
máy chủ, thậm chí có thể áp dụng kỹ thuật
cân bằng tải hoặc tính toán phân tán để chia
nhỏ công việc cho nhiều máy chủ thực hiện.
Việc phân bố các máy chủ bản sao tại các vị
trí địa lý khác nhau sẽ tạo điều kiện
cho máy khách lựa chọn máy chủ thích hợp nhất
để xử lý, tiết kiệm thời gian truy
nhập và đồng thời giảm lượng dữ
liệu lưu chuyển trên mạng. Hiệu năng
của máy khách tăng lên nhưng việc duy trì tính nhất
quán giữa các bản sao có thể lại làm tăng
đáng kể lưu lượng mạng.
Nhân bản mang lại lợi ích cho tính tin
cậy và hiệu năng nhưng lại phải
đối mặt với vấn đề nhất quán, khi
một bản sao bị thay đổi thì nội dung
của nó sẽ khác với các bản sao còn lại, như
vậy cần phải đảm bảo rằng những
thay đổi đều sẽ phải thực hiện
trên tất cả các bản sao, vấn đề nằm
ở chỗ thành phần nào và khi nào thực hiện
những thay đổi này. Để minh họa vấn
đề này có thể lấy trường hợp trang web
làm ví dụ, yêu cầu truy nhập trang web có thể
phải thực hiện trong vài giây. Để nâng cao
hiệu năng trình duyệt thường lưu cục
bộ bản sao của trang web gọi là cache, nếu
người dùng truy yêu cầu trang web lần nữa thì
trình duyệt sẽ tự động trả về
bản sao cục bộ này, do đó thời gian truy
nhập có thể coi như xấp xỉ bằng 0. Tuy nhiên
nếu người dùng luôn luôn muốn phiên bản mới
nhất của trang thì thật là không may mắn, vấn
đề nằm ở chỗ trong khoảng thời gian
giữa hai lần truy nhập trang web đã bị thay
đổi nhưng những thay đổi đó vẫn
chưa lan tỏa đến các bản sao đã lưu trên
máy khách, kết quả là người dùng sẽ nhìn
thấy nội dung cũ. Một giải pháp cho vấn
đề bản sao cũ là cấm trình duyệt giữ
các bản sao ở vị trí đầu tiên, thực sự
cho phép máy chủ hoàn toàn phụ trách việc nhân bản, tuy
nhiên giải pháp này vẫn có thể dẫn đến
thời gian truy nhập kém nếu như không có bản sao
nào gần với người sử dụng. Một giải
pháp khác là cho phép máy chủ làm mất hiệu lực
hoặc cập nhật các bản sao nhưng nhưn
thế đòi hỏi máy chủ phải lưu vết
tất cả các bộ nhớ cache và gửi thông
điệp cho chúng, kết quả là hiệu năng
tổng thể của máy chủ sẽ bị suy giảm
nghiêm trọng.
Nhân bản và lưu bản sao cache để
nâng cao hiệu năng đã được áp dụng
phổ biết như một kỹ thuật mở
rộng qui mô hệ thống, việc đặt các bản
sao dữ liệu gần với các tiến trình sử
dụng chúng có thể cải thiện hiệu năng
bằng cách giảm thời gian truy nhập và như
vậy giải quyết được các vấn
đề về qui mô hệ thống. Cân đối
giữa việc duy trì nội dung mới nhất với yêu
cầu băng thông mạng cần phải được
xem xét kỹ lưỡng, ví dụ tiến trình P
đọc bản sao N lần/s và bản sao
được cập nhật M lần/s, nếu N nhỏ
hơn M rất nhiều, nghĩa là tỉ lệ
đọc/ghi rất thấp thì có thể thấy kết
quả của nhiều lần cập nhật đã không
được tiến trình P sử dụng, làm cho
truyền thông mạng cho những phiên bản này trở nên
vô ích. Trong trường hợp này nên cài đặt bản
sao gần với tiến trình P hoặc áp dụng chiến
lược khác để cập nhật bản sao,
vấn đề này sẽ được đề
cập chi tiết trong phần sau.
Tuy nhiên, vấn đề nghiêm trọng
hơn đó ở chỗ việc duy trì nhiều bản sao
nhất quán cũng có thể là chủ đề cho các
vấn đề nghiêm trọng về qui mô, tập các
bản sao được coi là nhất quán khi tất
cả các bản sao đều giống nhau, nghĩa là thao
tác đọc tại bất kỳ bản sao nào cũng
trả về kết quả như nhau, kết quả là
thao tác cập nhật được thực hiện trên
một bản sao sẽ phải được lan tỏa
đến tất cả các bản sao trước khi thao
tác kế tiếp thực hiện, không phân biệt bản
sao khởi sướng hay thực hiện thao tác, nhất
quán loại này gọi là chặt chẽ và cũng
được gọi là nhân bản đồng bộ.
Tư tưởng chính là thao tác cập nhật
được thực hiện trên các bản sao như
một thao tác nguyên tử hay còn gọi là giao tác phân tán,
đáng tiếc việc cài đặt tính nguyên tử liên
quan đến lượng lớn các bản sao có thể
bị phân tán rải rác trên các mạng qui mô lớn vốn
rất khó thực hiện khi các thao tác cần phải
được hoàn thành trong thời gian ngắn nhất.
Khó khăn bắt nguồn từ thực
tế cần phải đồng bộ tất cả các
bản sao, về mặt nguyên tắc, các bản sao
phải đạt được sự đồng
thuận trên vấn đề chính xác khi nào thao tác cập
nhật sẽ được thực hiện cục
bộ, các bản so có thể phải quyết định
thứ tự toàn cục của các thao tác dựa trên nhãn
thời gian Lamport hoặc cho phép tiến trình điều
phối qui định thứ tự thực hiện.
Đồng bộ toàn cục chiếm lượng lớn
thời gian truyền thông, đặc biệt khi các bản
sao trải dài trên mạng diện rộng. Chúng ta
đối mặt với tình thế tiến thoái
lưỡng nan, một mặt có thể làm giảm bớt
các vấn đề về hiệu năng khi mở
rộng qui mô bằng cách áp dụng nhân bản và bộ nhớ
cache, mặt khác giữ cho tất cả các bản sao
nhất quán toàn cục đòi hỏi đồng bộ toàn
cục mà điều này thì lại kéo theo chi phí về
hiệu năng. Trong nhiều trường hợp chỉ
có cách nới lỏng các ràng buộc nhất quán, nếu
giảm bớt yêu cầu cập nhật phải
được thực hiện như các thao tác nguyên
tử thì mới có thể tránh được đồng
bộ toàn cục và như thế mới tăng hiệu
năng, cái giá phải trả đó là các bản sao có
thể không phải lúc nào cũng giống nhau. Như
vậy, nhất quán phải được nới lỏng
đến mức nào sẽ phụ thuộc rất lớn
vào việc truy nhập và các dạng cập nhật của
dữ liệu nhân bản cũng như mục đích
sử dụng những dữ liệu đó. Trong những
phần sau, trước hết sẽ đề cập
tới các mô hình nhất quán bằng cách định
nghĩa chính xác nhất quán thực sự là gì, sau đó
sẽ thảo luận những cách khác nhau để cài
đặt các mô hình nhất quán.
Khái niệm nhất quán ở đây
được hiểu trong ngữ cảnh các thao tác
đọc/ghi dữ liệu, cho dù đó là dữ liệu
được lưu trong bộ nhớ, trên tập tin hay
trong hệ quản trị cơ sở dữ liệu
đều gọi chung là kho dữ liệu. Kho dữ
liệu có thể được lưu trữ phân tán trên
nhiều máy tính, mỗi tiến trình có thể truy nhập
dữ liệu trong kho được coi là có bản sao
cục bộ sẵn có của toàn bộ kho dữ
liệu. Thao tác làm thay đổi dữ liệu
được xếp vào loại thao tác ghi, nếu không
thay đổi thì xếp vào loại thao tác đọc.

Hình 8.1 Tổ chức kho
dữ liệu trong hệ thống phân tán
Mô hình nhất quán,
về bản chất đó là thỏa thuận giữa
tiến trình và kho dữ liệu, các tiến trình phải tuân
thủ một số qui tắc để đảm
bảo tính chính xác của dữ liệu. Thông
thường, tiến trình thực hiện thao tác
đọc mục dữ liệu và hy vọng sẽ
nhận được giá trị phản ánh kết
quả ghi cuối cùng đã thực hiện trên mục
dữ liệu đó. Vì không tồn tại đồng
hồ toàn cục nên khó có thể xác định
được thao tác ghi nào là thao tác được
thực hiện cuối cùng. Để thay thế, chúng ta
phải định nghĩa một số mô hình nhất
quán, mỗi mô hình sẽ hạn chế khả năng
đọc giá trị của các mục dữ liệu, nói
cách khác sẽ không có mô hình nhất quán toàn diện.
Như đã đề
cập trong phần giới thiệu, hiện nay chưa có
một giải pháp nhân bản nào được coi là
giải pháp tốt nhất, nhân bản dữ liệu
đặt ra những vấn đề liên quan tới tính
nhất quán và do đó chưa có một phương pháp
tổng quát nào giải quyết hiệu quả vấn
đề này. Chỉ khi nới lỏng tính nhất quán thì
mới hy vọng đạt được giải pháp
hiệu quả, đáng tiếc lại không có một qui
tắc chung nào để nới lỏng tính nhất quán,
điều này hoàn toàn dựa vào yêu cầu khi xây dựng
phần mềm. Ví dụ, khi xây dựng phần mềm có
thể đưa ra các tiêu chí nhất quán sau:
-
Sự chênh lệch về giá
trị các bản sao: Giá trị có thể là của một
trường dữ liệu nhưng cũng có thể là
số lượng các thao tác làm thay đổi dữ
liệu.
-
Sự chênh lệch trạng
thái: Thời gian cập nhật cuối cùng lên dữ
liệu.
-
Sự chênh lệch thứ tự
các thao tác cập nhật: Khá phức tạp, nhất là
đối với các thao tác vì một lý do nào đó bị
hủy bỏ.
Để xác định
tính không nhất quán, Yu và Vahdat đưa ra khái niệm
đơn vị nhất quán, ví dụ minh họa thể
hiện trên hình 8.2, mỗi bản sao duy trì một
đồng hồ vector hai phần tử, phần tử
thứ nhất thể hiện nhãn thời gian của
bản sao A và phần tử thứ 2 thể hiện nhãn
thời gian của bản sao B, sử dụng ký hiệu <t,
i> là
thao tác tiến trình i thực hiện tại thời
gian logic t.
|

|
|
Đồng hồ vector A: (15, 5)
Độ lệch thao tác: 3
Sai
số: (1, 5)
|
Đồng
hồ vector B: (0, 11)
Độ
lệch thao tác: 2
Sai
số: (3, 6)
|
|
Hình
8.2 Tính nhất quán với điều kiện nới
lỏng thứ tự thao tác
|
Trong ví dụ này, hai
bản sao thao tác trên các mục dữ liệu x và y, giả
thiết ban đầu chúng đều có giá trị bằng
0. Bản sao A nhận được thao tác <5,B>: x:=x+2
từ bản sao B, thao tác ghi
dữ liệu vào x đã được lưu vào vùng
nhớ vĩnh cửu và không thể quay lui. Bản sao A
dự kiến thực hiện ba thao tác thay đổi
dữ liệu <8, A>, <12, A> và <14, A>, như
vậy đồng hồ vector trên bản sao A sau các thao tác
trên sẽ là (15,5) và độ lệch thứ tự thao tác
là 3. Chỉ có thao tác của bản sao B là <10, B> mà A chưa nhìn
thấy làm cho độ lệch thao tác là 1. Trọng số
của độ lệch giá trị là hiệu số
lớn nhất giữa giá trị của các biến số
trên các bản sao, trong ví dụ này giá trị (x,y) trên bản
sao A là (2, 0), trong khi đó giá trị trên bản sao B là (2,
5), vì vậy độ lệch giá trị sẽ là max(|2-2|,|5-0|)=5.
Tương tự, bản sao B dự kiến thực
hiện hai thao tác <5, B> và <10, B>, sau các thao tác
vẫn chưa nhìn thấy các thao tác từ bản sao A nên
đồng hồ vector trên bản sao B có giá trị là (0, 11),
như vậy độ lệch thao tác là 2, do chưa
khẳng định thay đổi nên giá trị của các
biến (x, y) vẫn là (0, 0) trong khi đó bản sao A đã
có thể thực hiện khằng định giá trị cho
hai biến này nên giá trị của chúng là (3, 6), vì vậy
độ lệch giá trị bằng max(|3-0|,|6-0|)=6. Nếu
độ lệch số lượng thao tác thực
hiện trên các bản sao và sai số không vượt quá
ngưỡng cho phép thì có thể coi như đã đáp
ứng yêu cầu nhân bản.
Cần thiết phải
cân nhắc khi lựa chọn đơn vị nhất quán,
nếu đơn vị nhất quán đại diện cho
một lượng lớn dữ liệu, ví dụ toàn
bộ cơ sở dữ liệu, thì các cập nhật
sẽ được tập hợp lại cho tất
cả dữ liệu trong đơn vị nhất quán,
kết quả là các bản sao sẽ sớm trở nên không
nhất quán. Hình 8.3 minh họa
đơn vị nhất quán, hai bản sao có thể khác
nhau nếu còn tồn tại một yêu cầu cập
nhật chưa được thực hiện.
Trường hợp (a) lựa chọn đơn vị
nhất quán với độ lệch số lượng
cập nhật là 2, khi thực hiện xong ở bản sao
thứ nhất mới lan tỏa cập nhật tới
bản sao thứ hai. Trường hợp (b) lựa
chọn đơn vị nhất quán nhỏ hơn, khi
thực hiện cập nhật trên bản sao thì ngay
lập tức sẽ được thực hiện trên
các bản sao khác, do đó có thể coi các bản sao
đều được cập nhật giá trị
mới nhất. Vấn đề chọn đơn vị
nhất quán đặc biệt quan trọng khi các mục
dữ liệu hoàn toàn độc lập với nhau,
trường hợp (a) có thể coi như đã chọn
sai đơn vị nhất quán.
|

|

|
|
(a) Lan truyền cập nhật
|
(b) Không lan truyền cập nhật
|
|
Hình 8.3 Số
lượng thao tác trong lan truyền cập nhật
|
Tuy nhiên, lựa chọn
đơn vị nhất quán rất nhỏ không phải là
một ý tưởng tốt vì số lượng
đơn vị nhất quán cần phải quản lý sẽ
tăng lên đáng kể, lượng thông tin điểu
khiển nhiều hơn và điều đó dẫn đến
suy giảm hiệu năng của hệ thống. Lý tưởng,
một thao tác được thực hiện trên một bản
sao phải được thực hiện ngay lập tức
trên các bản sao khác, hoặc ít nhất sau khi thao tác cập
nhật đã hoàn thành trên bản sao thì phải được
chuyển ngay sang các bản sao khác. Tuy nhiên thực tế sẽ
gặp nhiều trở ngại về mạng, nhất là
những hệ thống thường xuyên cập nhật,
vì vậy quyết định mỗi lần lan truyền cập
nhật gồm bao nhiêu thao tác sẽ do người thiết
kế hệ thống phần mềm quyết định.
Mặc dù có nhiều
biện pháp hay để đạt được các yêu cầu
nhất quán nhưng có hai vấn đề quan trọng cần
phải giải quyết trong thực tế, đó là việc
xây dựng các giao thức nhất quán liên tục và xác định
các yêu cầu nhất quán cho các ứng dụng. Thực tế
cho thấy, việc duy trì các yêu cầu này rất khó, lập
trình viên nói chung không quen xử lý nhân bản., vì vậy cần
phải cung cấp giao diện lập trình đơn giản
và dễ hiểu. Có thể cài đặt tính nhất quán
liên tục trong bộ công cụ dưới dạng thư
viện liên kết với các ứng dụng, đơn vị
nhất quán sẽ được khai báo bên cạnh các thao
tác cập nhật dữ liệu.
Bên
cạnh tính nhất quán liên tục, mô hình nhất quán
lấy dữ liệu làm trung tâm còn phải giải
quyết vô số các nhiệm vụ khác, các tiến trình
tính toán phân tán và song song còn phải đương
đầu với vấn đề chia sẻ tài nguyên nhưng
vẫn đảm bảo tính tương tranh. Nhiều mô
hình đã được đưa ra, phần này sẽ
đề cập tới mô hình đảm bảo tính
nhất quán theo thứ tự các thao tác, chúng làm tăng tính
nhất quán liên tục, các bản sao cần phải
đạt được sự đồng thuận
về thứ tự của các thao tác cập nhật. Các mô
hình sẽ đề cập tới trong phần này bao
gồm:
-
Mô
hình nhất quán nghiêm ngặt
-
Mô
hình nhất quán tuần tự
-
Mô
hình nhất quán nhân quả
-
Mô
hình nhất quán hàng đợi
-
Mô hình nhất quán yếu
-
Mô hình nhất quán đi ra
-
Mô hình nhất quán đi vào
Giả sử mục
dữ liệu x ban đầu có giá trị là null, ký
hiệu Wi(x)a là thao tác tiến trình Pi thực
hiện ghi giá trị a lên mục dữ liệu x, Ri(x)b là thao tác tiến
trình Pi thực hiện đọc mục dữ
liệu x và cho kết quả b.
|

|
|
(a)
Nhất quán nghiêm ngặt
|
(b)
Không nhất quán nghiêm ngặt
|
Hình 8.4 Mô hình nhất quán
nghiêm ngặt
Mô hình nhất quán nghiêm
ngặt là mô hình trong đó bất kỳ thao tác đọc nào
trên mục dữ liệu nào đều trả về
một giá trị tương ứng với kết quả
của thao tác ghi gần nhất trên mục dữ liệu
đó. Định nghĩa trên rất tự nhiên và rõ ràng,
mặc dù nó ngầm thừa nhận sự tồn tại
của thời gian toàn cục tuyệt đối, đó là
thời gian chung cho cả hệ thống để xác
định chính xác khái niệm thao tác ghi gần nhất, điều
này là khó khả thi với hệ phân tán. Hình 8.4 minh họa tiến
trình P1 thực
hiện ghi giá trị a vào biến x sau đó lan tỏa sang
các bản sao khác. Tiến trình P2 đọc biến x, nếu
nhận được giá trị a thì đó đáp ứng
yêu cầu mô hình nhất quán nghiêm ngặt, ngược
lại sẽ không phải là nhất quán nghiêm ngặt.
Như vậy để đảm bảo cho hoạt
động của mô hình nhất quán nghiêm ngặt thì không
thể thực hiện theo phương pháp cập nhật
xong bản gốc rồi mới lan tỏa đến các
bản sao vì sẽ tốn thời gian để di
chuyển thông điệp. Mô hình nhất quán nghiêm ngặt
đòi hỏi tính nguyên tử của các thao tác cập
nhật, yêu cầu cập nhật phải đến
được tất cả các bản sao ngay lập
tức, điều này chỉ có thể thực hiện
được bằng các kỹ thuật giao tác phân tán.
Mô hình nhất quán tuần
tự được Lamport đề xuất vào năm
1979 trong ngữ cảnh bộ nhớ dùng chung cho các hệ
thống nhiều bộ xử lý, kho dữ liệu
được coi là nhất quán tuần tự nếu
kết quả của bất kỳ tiến trình nào cũng
như nhau khi các thao tác được thực hiện theo
thứ tự giống nhau. Như vậy nhất quán tuần
tự là mô hình lỏng và yếu hơn mô hình nhất quán
nghiêm ngặt, nó phải thỏa mãn các yêu cầu sau:
-
Kết quả của thực hiện như
nhau nếu thao tác đọc và ghi do các tiến trình
thực hiện trên mục dữ liệu một cách
tuần tự và các thao tác của mỗi tiến trình
xuất hiện trong chuỗi thao tác này do chương trình qui
định.
-
Khi các tiến trình chạy đồng
thời trên các máy khác nhau thì cho phép sự đan xen của
các thao tác nhưng tất cả các tiến trình đều
phải nhận biết giống nhau về sự đan
xen của các thao tác.

Hình 8.5 Mô hình nhất quán
tuần tự
Mô hình nhất quán tuần
tự không đề cập đến yếu tố
thời gian, như vậy không cần phải tham chiếu
đến thao tác ghi gần nhất lên mục dữ
liệu, tiến trình phải nhìn thấy thao tác ghi từ tất
cả các tiến trình khác chứ không phải chỉ thao
tác ghi của mình. Hình 8.5 (a) minh họa nhất quán tuần tự, tiến trình
P1 thực hiện ghi giá trị a vào biến x sau
đó tiến trình P2 cũng thực hiện ghi giá
trị b vào biến này, các tiến trình P3 và P4
đều đọc được giá trị b sau đó
mới đọc được giá trị a, điều
đó chứng tỏ thao tác ghi của tiến trình P2
được thực hiện trước thao tác ghi
của tiến trình P1. Ngược lại, hình 8.5 (b) cho thấy tiến trình
P3 đọc được giá trị b
trước giá trị a, trong khi đó tiến trình P4
lại đọc được giá trị a trước
giá trị b, điều đó chứng tỏ không thỏa
mãn yêu cầu nhất quán tuần tự.

Hình 8.6 Ba tiến trình
thực hiện tương tranh
Để minh họa cho
nhất quán tuần tự, hãy xem xét ví dụ ba tiến
trình thực hiện tương tranh trên hình 8.6, các mục dữ liệu được
thể hiện bằng ba biến (x, y, z) đều có giá
trị ban đầu bằng 0, thao tác gán thể hiện
cho lệnh ghi và thao tác in thể hiện cho lệnh
đọc. Tuần tự xen kẽ thực hiện
với 6 lệnh trên sẽ cho 720 khả năng, mặc dù
một số tổ hợp vi phạm thứ tự
của chương trình. Nếu xét trường hợp ghi
giá trị 1 vào biến x được thực hiện
trước thì sẽ có 120 khả năng, trong đó
chỉ có 30 khả năng hợp lệ theo thứ tự
chương trình.
Hình 8.7 (a) thể hiện thứ
tự thực hiện các tiến trình P1, P2
và P3, ba trường hợp còn lại minh họa
các khả năng khác nhau về việc xen kẽ các
lệnh nhưng vẫn đảm bảo theo đúng
thứ tự đã qui định trong chương trình.
Nếu tập trung vào kết quả in của các tiến
trình theo thứ tự P1, P2 và P3, chúng ta sẽ nhận được xâu ký
tự thể hiện chữ ký, như vậy sẽ có 64
khả năng xảy ra nhưng không phải khả
năng nào cũng hợp lệ vì cần phải
đảm bảo yêu cầu theo đúng thứ tự
của chương trình gán giá trị vào biến
trước khi thực hiện lệnh in.
|

|
|
(a)
|
(b)
|
(c)
|
(d)
|
Hình 8.7 Bốn trường
hợp nhất quán tuần tự hợp lệ
Ví dụ chữ ký 001001 không
hợp lệ vì hai bit đầu tiên 00 thể hiện
tiến trình P1 được thực hiện đầu
tiên, hai bit kế tiếp thể hiện tiến trình P2
thực hiện trước tiến trình P3, hai bit cuối
cùng 01 thể hiện tiến trình P3 thực hiện
trước tiến trình P1 nên mâu thuẫn với kết
luận phân tích hai bit đầu tiên. Như vậy trong
số 90 khả năng tổ hợp được coi là
hợp lệ sẽ không quá 64 khả năng
được phép thực hiện theo quan điểm
nhất quán tuần tự, các tiến trình phải chấp
nhật các giá trị hợp lệ này.
Mô hình nhất quán nhân quả
do Hutto và Ahamad đề xuất vào năm 1990 thể
hiện sự nới lỏng nhất quán tuần tự,
nó phân
biệt các sự kiện có quan hệ nhân quả và các
sự kiện không có quan hệ nhân quả. Xét ví dụ
về nhân bản cơ sở dữ liệu phân tán trên hình
8.8, tiến trình P1 thực hiện ghi các giá trị
vào a và c vào biến x bằng các lệnh W1(x)a và W1(x)c,
tiến trình P2 đọc giá trị biến x R2(x)
a và thực hiện thao tác W2(x)b để ghi giá
trị b vào biến x, dễ dàng nhận thấy quan hệ
nhân quả W1(x)a à W1(x)c vì các
thao tác ghi đều được thực hiện trên
tiến trình P1, R2(x)a à W2(x)b vì thao tác
đọc được thực hiện trước thao
tác ghi trong tiến trình P2, trong khi đó hai sự
kiện W2(x)b và W1(x)c tương tranh
với nhau nên chúng không có mối quan hệ nhân quả.
Như vậy các tiến trình chỉ cần thực
hiện theo thứ tự W1(x)a còn thứ tự
thực hiện các lệnh W2(x)b và W1(x)c
không quan trọng.

Hình 8.8 Mô hình nhất quán
nhân quả
Nếu sự kiện B
được gây ra hoặc bị tác động bởi
một sự kiện a xảy ra sớm hơn thì tính nhân
quả đòi hỏi mọi thực thể khác phải nhìn
thấy a trước rồi mới thấy b. Mô hình nhất
quán nhân quả thỏa mãn các điều kiện sau: các thao
tác ghi có quan hệ nhân quả tiềm năng phải
được nhận biết bởi tất cả các
tiến trình khác trong cùng một thứ tự. Các thao tác ghi
không có quan hệ nhân quả thì có thể thực hiện theo
thứ tự khác nhau trên các tiến khác nhau.

Hình 8.9 Nhất quán nhân
quả và vi phạm tính nhất quán nhân quả
Một ví dụ khác trên hình 8.9,
tiến trình P1 thực hiện lệnh W1(x)a
để ghi giá trị vào biến x, tiến trình P2
thực hiện lệnh W2(x)b để ghi giá
trị b vào biến x, tuy nhiên trường hợp (a)
tiến trình P2 thực hiện lệnh đọc
R2(x)a trước thi thực hiện lệnh ghi, do
đó có thể xác định quan hệ nhân quả W1(x)a
à W2(x)b, vì
vậy trường hợp này không đáp ứng yêu
cầu nhất quán nhân quả. Trái lại, trường
hợp (b) cho kết quả giống như trường
hợp (a) nhưng lại đáp ứng yêu cầu nhân
quả vì W1(x)a || W2(x)b. Việc cài
đặt nhất quán nhân quả đòi hỏi phải
lưu vết những tiến trình đã thực hiện
lệnh ghi, cần thiết phải xây dựng đồ
thị phụ thuộc, điều này có thể thực
hiện bằng cách gán nhãn thời gian vector cho các thao tác.
Mô hình nhất quán hàng
đợi là mô hình yếu hơn mô hình nhất quán chặt
nhưng mạnh hơn mô hình nhất quán tuần tự. Mô
hình này thỏa mãn điều kiện sau: Kết quả
của bất kì sự thực hiện nào là như nhau
nếu các thao tác đọc hoặc ghi của tất
cả các tiến trình lên dữ liệu được
thực hiện môt cách tuần tự và các thao tác của
mỗi tiến trình xuất hiện trong chuỗi thao tác này
phải theo thứ tự đã được chỉ ra
trong chương trình của nó.

Hình 8.10 Mô hình nhất quán
hàng đợi
Đây là mô hình yếu
nhất vì mô hình này bỏ qua giới hạn về trật
tự của bất kì thao tác đồng thời nào. Nhất
quán hàng đợi thỏa mãn điều kiện các thao tác
ghi bởi một tiến trình đơn phải
được tất cả các tiến trình khác nhìn
thấy theo cùng một trật tự mà chúng đề ra nhưng
thao tác ghi bởi nhiều tiến trình khác nhau có thể
được thấy theo những trật tự khác nhau.
Trong ví dụ trên hình 8.10, mặc dù các tiến trình P3
và P4 đọc được các giá trị theo
thứ tự khác nhau nhưng chúng vẫn đảm
bảo thao tác cập nhật thứ tự cập nhật
các thao tác W(x)b và W(x)c theo đúng thứ tự qui
định trong chương trình của tiến trình P2.
Nhất quán
tuần tự và nhất quán nhân quả được
định nghĩa ở mức độ các thao tác đọc
và ghi, cấp độ nhỏ nhất này xuất phát
từ lịch sử, ban đầu các mô hình
được phát triển cho các hệ thống nhiều
bộ xử lý chia sẻ bộ nhớ, chúng thực
sự được cài đặt trong phần cứng.
Cấp độ rất nhỏ của các mô hình nhất
quán trên không phù hợp với mức độ của các
ứng dụng, tính tương tranh giữa dữ liệu
chia sẻ được điều khiển bằng các
cơ chế đồng bộ để loại trừ
lẫn nhau và các giao tác, các lệnh đọc và ghi
được thực hiện giữa hai thao tác chiếm
vùng tới hạn ENTER_CS và rời khỏi vùng tới
hạn LEAVE_CS, khi đã vào được vùng tới
hạn thì tiến trình có thể an tâm thực hiện
chuỗi các lệnh đọc và ghi trên kho dữ liệu.
Về bản
chất, điều gì xảy ra bên trong chương trình mà
dữ liệu chịu tác động bởi một
loạt các thao tác đọc ghi được bảo
vệ chống lại những truy nhập tương
tranh, đó sẽ không phải là kết quả của
việc thực hiện chuỗi các lệnh như một
thể thống nhất. Nếu đặt chuỗi các
lệnh này vào một đơn vị thực hiện
nguyên tử thì sẽ nâng mức độ mịn,
để đạt được điều này thì
cần phải có ngữ cảnh chính xác liên quan tới các
thao tác xâm nhập và thoát khỏi vùng tới hạn, ngữ
cảnh này được hình thành dựa trên khái niệm
các biến đồng bộ chia sẻ. Một tiến
trình muốn vào vùng tới hạn thì phải yêu cầu
biến đồng bộ và khi thoát khỏi vùng tới
hạn thì phải giải phóng các biến này, dữ
liệu trong vùng tới hạn của tiến trình có
thể kết hợp với nhiều biến đồng
bộ khác nhau.
Mỗi
biến đồng bộ có chủ sở hữu hiện
hành, cụ thế đó là tiến trình cuối cùng
chiếm hữu được biến đó, chủ
sở hữu có thể vào và ra khỏi vùng tới hạn
liên tục mà không cần phải gửi các thông
điệp lên mạng. Một tiến trình muốn
chiếm quyền sở hữu biến đồng bộ
và thao tác với dữ liệu liên quan tới biến
đồng bộ đó thì phải gửi thông điệp
đến chủ sở hữu hiện hành. Một số
tiến trình cũng có thể đồng sở hữu
biến đồng bộ trong chế độ không
độc quyền, chúng chỉ đọc chứ không ghi
vào dữ liệu liên quan tới biến đồng bộ
đó. Bershad năm 1993 đã chỉ ra ba yêu cầu cần
phải đáp ứng:
1.
Các tiến trình không được phép truy
nhập vào biến đống bộ cho đến khi
tiến trình đang sở hữu biến đồng
bộ hoàn thành tất cả các thao tác cập nhật lên
dữ liệu chia sẻ đã được bảo
vệ cho tiến trình đó.
2.
Trước khi truy nhập biến
đồng bộ chế độ độc quyền thì
không một tiến trình nào có thể chiếm giữ
biến đồng bộ, thậm chí việc chiếm
giữ biến đồng bộ đó trong chế
độ không độc quyền.
3.
Sau khi một tiến trình đã truy
nhập biến đồng bộ ở chế độ
độc quyền thì các tiến trình khác không
được thực hiện truy nhập biến
đồng bộ ở chế độ không độc
quyền cho đến khi tiến trình đang chiếm giữ
biến đồng bộ hoàn thành công việc.
Điều
kiện thứ nhất nói rằng, khi một tiến trình
chiếm hữu biến đồng bộ thì việc
chiếm hữu đó có thể chưa hoàn thành cho
đến khi tất cả các dữ liệu
được bảo vệ đã hoàn thành cập
nhật. Điều kiện thứ hai ngụ ý
trước khi cập nhật mục dữ liệu chia
sẻ thì tiến trình phải vào vùng tới hạn ở
chế độ độc quyền để đảm
bảo rằng không một tiến trình nào khác có thể
thay đổi mục dữ liệu chia sẻ trong cùng
thời gian đó. Điều kiện thứ ba nói rằng
nếu một tiến trình muốn vào vùng tới hạn
trong chế độ không độc quyền thì
đầy tiên phải kiểm tra với chủ sở
hữu của biến đồng bộ bảo vệ vùng
tới hạn để lấy bản sao gần nhất
của dữ liệu chia sẻ được bảo
vệ.
Mặc dù mô hình
nhất quán hàng đợi đã có hiệu năng tốt
hơn các mô hình trước nhưng nó vẫn có một
số hạn chế không cần thiết đối
với các ứng dụng bởi vì nó đòi hỏi các thao
tác ghi phát sinh từ một tiến trình phải được
các tiến trình khác nhìn thấy theo đúng trình tự. Ví
dụ một tiến trình trong vùng tới hạn đang
đọc và ghi một số biến trong vòng lặp,
một số tiến trình không cho rằng có thể
tiếp cận các biến này cho đến khi tiến trình
thứ nhất rời khỏi vùng tới hạn, bộ
nhớ không biết chắc khi nào tiến trình ở trong
vùng tới hạn và do đó nó sẽ lan tỏa thao tác ghi
đến các bộ nhớ theo cách thông thường. Mô
hình nhất quán yếu không tập trung vào các thao tác trên
dữ liệu như các mô hình trên mà chúng quan tâm đến
trật tự các nhóm lệnh bằng việc sử
dụng các biến đồng bộ, năm 1986 Dubois đã
định nghĩa ba đặc tính của mô hình nhất quán yếu như sau:
-
Việc truy cập đến một
biến đồng bộ là nhất quán tuần tự.
-
Không có thao tác nào lên các biến đồng
bộ được phép thực hiện cho đến khi
tất cả các thao tác ghi trước đó
được hoàn thành ở mọi nơi.
-
Không có thao tác đọc hay ghi dữ
liệu lên các mục dữ liệu nào được phép
thực hiện cho đến khi tất cả các thao tác
trước đó lên các biến đồng bộ
được thực hiện.

Hình 8.11 Mô hình nhất quán
yếu
Xét ví dụ trên hình 8.11,
tiến trình P1 thực hiện hai lệnh ghi liên
tiếp W1(x)a và W1(x)b sau đó thực
hiện đồng bộ, trên hình vẽ ký hiệu
bằng chữ S. Trường hợp (a), hai tiến trình P2
và P3 thực hiện các lệnh đọc sau
đó mới đồng bộ nên thứ tự của
chúng khác nhau nhưng vẫn được coi là đáp
ứng yêu cầu của mô hình nhất quán yếu.
Trường hợp (b), tiến trình P2 thực
hiện đồng bộ sau đó mới đọc giá
trị của biến x, như vậy có thể coi
tiến trình P2 đã được đồng
bộ nên giá trị đọc được của
biến x phải là b, do đó có thể coi như không
đáp ứng yêu cầu mô hình nhất quán yếu.
Trong mô hình nhất quán
yếu, khi đã truy nhập được biến
đồng bộ thì không biết được khi nào
tiến trình mới hoàn thành việc đọc hoặc ghi
dữ liệu, kết quả là cần phải thực
hiện động tác để đảm bảo
chắc chắn các cập nhật cục bộ
đều đã hoàn thành. Nếu các tiến trình có thể
cho biết việc thâm nhập và rời khỏi vùng
tới hạn thì việc cài đặt sẽ hiệu
quả hơn có thể thực hiện được,
cần thiết phải có hai biến đồng bộ
chứ không phải là một biến.
Mô hình nhất quán đi
ra sử dụng lệnh chiếm giữ Acq để có
thể vào vùng tới hạn và lệnh giải phóng Rel
để ra khỏi vùng tới hạn, hai lệnh này
được thực hiện bằng các thao tác theo
thứ tự trên các biến hoặc bằng các thao tác
đặc biệt, chúng chỉ thực hiện với các
dữ liệu dùng chung chứ không áp dụng cho tất
cả các dữ liệu. Việc truy nhập vào các biến
đồng bộ hóa là nhất quán hàng đợi, không yêu
cầu nhất quán tuần tự.

Hình 8.12 Mô hình nhất quán
đi ra
Mô hình nhất quán đi
ra thỏa mãn các điều kiện sau:
-
Trước khi thực hiện một thao
tác đọc hay ghi lên dữ liệu chia sẻ thì tất
cả các thao tác chiếm giữ do tiến trình này thực
hiện trước đó phải được hoàn
tất.
-
Trước khi một thao tác giải phóng
Rel được phép thực hiện thì tất cả các
thao tác đọc và ghi do tiến trình này thực hiện
trước đó phải được hoàn tất.
Hình 8.12 minh họa mô hình
nhất quán đi ra, tiến trình P1 gửi yêu cầu
chiếm giữ và thực hiện cập nhật các
mục dữ liệu, khi cập nhật xong dữ
liệu trên bản sao cục bộ mới lan tỏa
cập nhật tới các bản sao khác.
Mô hình nhất quán đi
vào cũng sử dụng hai lệnh chiếm giữ Acq và lệnh
giải phóng Rel khi muốn vào vùng tới hạn, thay cho
việc khóa toàn bộ dữ liệu chia sẻ thì chỉ
kết hợp khóa với mỗi mục dữ liệu, các
lệnh này thao tác trên từng mục dữ liệu của
vùng dữ liệu chia sẻ. Tiến trình nào muốn
sử dụng mục dữ liệu thì phải đợi
cho tất cả các tiến trình khác giải phóng mục
dữ liệu đó. Hình 8.12 minh họa nhất quán đi
vào, tiến trình P1 yêu cầu chiếm giữ và ghi
giá trị a vào biến x sau đó tiếp tục chiếm
giữ và thay ghi giá trị b vào biến y, cuối cùng
giải phóng hai biến này. Tiến trình P2 gửi
yêu cầu chiếm giữ để đọc giá trị
của biến x sau khi tiến trình P1 đã
giải phóng biến này nhưng chưa giải phòng
biến y, do đó P2 đọc được giá
trị a và nếu đọc biến y thì có thể sẽ
nhận được giá trị null. Tiến trình P3
gửi yêu cầu chiếm giữ để đọc
biến y sau khi tiến trình P1 giải phóng biến y và vì
vậy nó nhận được giá trị b.

Hình 8.12 Mô hình nhất quán
đi vào
Vấn đề của
nhất quán đi vào là phải kết hợp chính xác
dữ liệu với biến đồng bộ, trong cách
tiếp cận dựa trên đối tượng chúng ta có
thể kết hợp biến đồng bộ với
đối tượng và thực hiện tuần tự
hóa khi gọi các đối tượng này. Nếu không
sử dụng cách tiếp cận trên thì có thể thông báo
tường minh những dữ liệu nào sẽ bị
ảnh hưởng khi thực hiện giao tác. Để
ghi lên một mục dữ liệu, máy khách phải có
được biến đồng bộ của mục
đó trong chế độ dành riêng, điều này có
nghĩa là không máy khách nào khác có thể sử dụng
biến đó, khi máy khách cập nhật xong mục dữ
liệu thì nó giải phóng biến đó. Khi máy khách muốn
đọc một mục dữ liệu nào đó, nó
phải có được biến đồng bộ hóa
kết hợp ở chế độ không dành riêng, nhiều
máy khách có thể giữ biến đồng bộ hóa
ở chế độ không dành riêng. Khi thực hiện
một thao tác chiếm giữ Acq, máy khách lấy về
phiên bản mới nhất của mục dữ liệu
từ tiến trình cuối cùng thực hiện thao tác chiếm
giữ trên biến đó. Nhất quán đi vào phải
thỏa mãn các điều kiện sau:
-
Một thao tác chiếm giữ Acq
để truy cập vào một biến đồng bộ
hóa không được phép thực hiện trong một
tiến trình cho đến khi tất cả các cập
nhật lên mục dữ liệu trong tiến trình đó
được thực hiện.
-
Trước khi một truy cập trong
chế độ dành riêng của một tiến trình
tới một biến đồng bộ được
phép thực hiện thì không tiến trình nào khác còn được
giữ các biến đồng bộ, trong chế
độ không dành riêng thì không cần yêu cầu như
vậy.
Sau khi một truy cập
trong chế độ dành riêng lên một biến
đồng bộ hóa được thực hiện thì
bất kì sự truy nhập của tiến trình nào khác trong
chế độ không dành riêng lên biến đó cũng không
được thực hiện cho đến khi chủ
nhân của biến đồng bộ thực hiện xong
việc truy cập của mình.
Tại thời
điểm này cần thiết phải làm rõ sự khác
biệt giữa hai khái niệm liên quan mật thiết
với nhau, các mô hình nhất quán đề cập trong các
phần trước thực
tế đã giải quyết vấn đề các tiến
trình thực hiện thao tác đọc và ghi trên tập các
mục dữ liệu, chúng mô tả kết quả mong
đợi khi nhiều tiến trình đồng thời
thực hiệc các thao tác trên dữ liệu, sẽ
nhất quán nếu tuân thủ các qui tắc đã đề
ra cho mô hình. Các mô hình gắn kết mô tả kết quả
mong đợi đối với từng mục dữ
liệu, trong trường hợp này dữ liệu
được nhân bản ở nhiều nơi, chúng
được coi là gắn kết khi các bản sao tuân
thủ qui tắc đã định nghĩa trong mô hình
gắn kết. Mô hình phổ biến về gắn kết là
mô hình nhất quán tuần tự nhưng chỉ áp dụng
cho một mục dữ liệu, nghĩa là trong
trường hợp các yêu cầu cập nhật xảy ra
đồng thời thì tất cả các tiến trình sẽ
nhìn thấy cùng một thứ tự thực hiện các yêu
cầu cập nhật.
8.3
Nhất
quán lấy máy khách làm trung tâm
Các
mô hình nhất quán lấy dữ liệu làm trung tâm cung cấp
cách nhìn nhất quán tổng thể về việc lưu trữ
dữ liệu, nó giải quyết vấn đề nhiều
tiến trình liên tục cập nhật tương tranh trên
dữ liệu. Khả năng điều khiển
tương tranh trên dữ liệu chia sẻ nhưng vẫn
duy trì được tính nhất quán tuần tự là một
trong những nhiệm vụ cơ bản của các hệ
thống phân tán, tính nhất quán tuần tự được
đảm bảo khi và chỉ khi sử dụng cơ chế
đồng bộ, vì lý do hiệu năng nên sẽ phải
sử dụng một số mô hình khác. Phần này giới
thiệu mô hình nhất quán lấy máy khách làm trung tâm với
giả thiết hệ thống chủ yếu thực hiện
đọc dữ liệu và ít khi xảy ra hiện tượng
cập nhật liên tục, nếu có thì cũng dễ dàng
giải quyết. Các kho dữ liệu cung cấp mô hình nhất
quán rất yếu, tính không nhất quán sẽ được
che giấu bằng các biện pháp tương đối
đơn giản:
-
Mô hình nhất quán sau cùng
-
Mô hình nhất quán đọc đều
-
Mô hình nhất quán ghi đều
-
Mô hình nhất quán đọc kết
quả ghi
-
Mô hình nhất
quán ghi theo sau đọc
Trong nhiều
hệ thống cơ sở dữ liệu, hầu hết
các tiến trình thực hiện đọc chứ ít khi
thực hiện các thao tác ghi, như vậy xung đột
ghi/ghi hiếm khi xảy ra mà chủ yếu phải
giải quyết vấn đề xung đột
đọc/ghi. Nếu một tiến trình cập nhật
dữ liệu và nhiều tiến trình đang cần
đọc thì phải giải quyết là làm sao các thao tác
ghi được thực hiện nhanh nhất để
cung cấp kết quả cho các tiến trình chỉ
đọc, vậy tính nhất quán cần hoàn toàn có thể
bị vi phạm. Nếu trong một
khoảng thời gian dài mà không xuất hiện lệnh
cập nhật thì các bản sao sẽ dần dần
trở nên nhất quán, loại nhất quán này gọi là nhất
quán sau cùng.
Nhất quán sau cùng sẽ
hoạt động tốt nếu máy khách chỉ truy
nhập đến một bản sao, vấn đề
sẽ nảy sinh khi máy khách thực hiện cập
nhật tại một bản sao và trong thời gian
ngắn chuyển sang bản sao khác. Trường hợp máy
khách là thiết bị di động, việc thực
hiện yêu cầu trên gặp khó khăn hơn, phải luôn
đảm bảo rằng ngay cả khi máy khách thay
đổi về vị trí vật lý thì việc sử
dụng các bản sao cũng phải chính xác, tức là các
bản sao luôn nhất quán. Ví dụ trên hình 8.13,
người dùng sử dụng máy tính kết nối
mạng không dây, việc kết nối đến bản sao
nào hoàn toàn trong suốt đối với người
sử dụng, sau khi cập nhật tại một bản
sao người dùng di chuyển sang vị trí khác và hoàn toàn
có khả năng phần mềm ứng dụng có thể
kết nối đến bản sao chưa kịp cập
nhật. Sau các thao tác cập nhật thì tất cả các
bản sao đều phải giống nhau, yêu cầu này
sẽ được thực hiện tốt nếu
mỗi máy khách luôn chịu khó cập nhật cho các bản
sao. Việc cập nhật
các bản sao ngay sau khi cập nhật bản chính có thể
kéo dài thời gian thực hiện, do đó lập trình viên
cần dự đoán thời gian thực hiện mỗi
yêu cầu và lựa chọn phương án thích hợp.

Hình 8.13 Mô hình nhất quán
sau cùng
Vấn đề trên có
thể giảm bớt bằng cách sử nhất quán
lấy máy khách làm trung tâm, nó đảm bảo tính nhất
quán cho một máy khách chứ không đảm bảo nhất
quán cho các máy khách khác nhau. Về cơ bản, máy khách
sẽ chỉ kết nối đến một bản sao,
bản sao đó có thể cài đặt cục bộ,
mọi thao tác đều được thực hiện
trên bản sao này, các thao tác cập nhật sẽ
được lan tỏa đến các bản sao khác trong
hệ thống.
Mô hình nhất quán
đọc đều phải đảm bảo
điều kiện tiến trình thực hiện thao tác
đọc trên một mục dữ liệu thì những thao
tác đọc tiếp theo sẽ cho kết quả không
cũ hơn kết quả lần trước. Máy khách
sẽ không bao giờ phải nhìn thấy những dữ
liệu cũ hơn những gì mà mình đã đọc
trước đó, điều này có nghĩa là khi máy khách
thực hiện một thao tác đọc trên một
bản sao rồi tiếp theo lại đọc trên một
bản sao khác thì bản sao thứ hai ít nhất cũng
phải được ghi giống với bản sao
đầu tiên.
|

|

|
|
(a) Nhất quán đọc đều
|
(b) Không đảm bảo nhất quán đọc đều
|
Hình 8.14 Mô hình nhất quán
đọc đều
Hình 8.14 minh họa ví
dụ về hệ thống lưu trữ gồm hai
bản sao L1 và L2, ký hiệu WS(xi)
là thao tác ghi xi vào mục dữ liệu, WS(xi
,xi+1) là thao tác bao gồm cả thao tác ghi xi
vào mục dữ liệu. Trường hợp (a), tiến
trình cập nhật dữ liệu lên bản sao L1
sau đó lan tỏa đến bản sao L2, tại
bản sao L2, thao tác ghi x1 là phần
đầu của thao tác WS(x1 ,x2) nên máy khách
đọc bản sao trên L2 chắc chắn sẽ
nhận được giá trị x2 , như
vậy thỏa mãn yêu cầu nhất quán đọc
đều. Trường hợp (b) bản sao L2
chỉ thực hiện thao tác ghi WS(x2) sau đó
đọc được giá trị x2, tuy nhiên thao
tác WS(x1) chưa được thực hiện trên
L2 nên không có gì đảm bảo sau này không
đọc được giá trị x1, vì vậy
trường hợp này không đáp ứng yêu cầu
nhất quán đọc đều.
Trong nhiều
trường hợp, thứ tự thực hiện các thao
tác cập nhật của một tiến trình phải
được lan tỏa đến các bản sao theo
đúng thứ tự. Mô hình nhất quán ghi đều
phải đảm bảo điều kiện thao tác ghi lên
mục dữ liệu x của một tiến trình phải
được hoàn thành trước bất kỳ một
thao tác ghi nào khác trên x bởi cùng tiến trình đó, nói cách
khác các thao tác ghi của một tiến trình lên một
mục dữ liệu sẽ được sắp
xếp theo thứ tự
đã đề ra trong tiến trình.
|

|

|
|
(a) Nhất quán ghi đều
|
(b) Không đảm bảo nhất quán ghi đều
|
Hình 8.15 Mô hình nhất quán
ghi đều
Như vậy, nhất
quán ghi đều giống như nhất quán hàng
đợi trong trường hợp áp dụng cho một
tiến trình. Ví dụ trên hình 8.15 tiến trình thực
hiện thao tác cập nhật W(x1) và WS(x2),
trường hợp (a) bản sao L3 nhận
thực hiện cả hai lệnh này theo thứ tự nên
nó đáp ứng yêu cầu nhất quán ghi đều.
Trường hợp (b) bản sao L2 chỉ
thực hiện lệnh cập nhật W(x2),
như vậy lệnh cập nhật W(x1) có
thể sẽ đến sau và do đó không đảm bảo yêu cầu
nhất quán ghi đều.
Trong mô hình nhất quán
này, người dùng được đảm bảo
rằng sẽ luôn được nhìn thấy những
kết quả ghi mới nhất. Mô hình nhất quán
đọc kết quả ghi phải thỏa mãn
điều kiện kết quả thao tác ghi của một
tiến trình lên mục dữ liệu x sẽ luôn
được nhìn thấy bởi một thao tác
đọc kế tiếp tiến trình đó trên x, nói cách
khác thao tác ghi phải được hoàn thành trước
bất kỳ thao tác đọc kế tiếp nào của
cùng tiến trình ở bất cứ bản sao nào. Mô hình
nhất quán đọc kết quả ghi gần giống
với mô hình nhất quán đọc đều,
điểm khác biệt chỉ ở chỗ tính nhất
quán bây giờ được quyết định bằng
thao tác ghi của tiến trình chứ không phải thao tác
đọc.
|

|

|
|
(a) Nhất quán đọc kết
quả ghi
|
(b)
Không đảm bảo nhất quán đọc kết
quả ghi
|
Hình 8.16 Mô hình nhất quán
đọc kết quả ghi
Ví dụ trường
hợp máy chủ web sử dụng cơ chế cache, khi
biên tập viên đã hoàn thành cập nhật bài viết
nhưng người dùng vẫn không nhìn thấy nội dung
mới cập nhật, nguyên nhân là do máy chủ web trả
về giá trị lưu trong cache. Nhất quán đọc
kết quả ghi đảm bảo rằng khi biên tập
viên cập nhật nội dung của mục dữ
liệu thì cache cũng được cập nhật. Hình
8.16 minh họa tiến trình thực hiện thao tác ghi W(xi)
sau đó thực hiện thao tác đọc R(xi) trên
bản sao khác, trường hợp (a) thao tác W(x1;x2)
thể hiện thao tác ghi W(x1) là một phần
của thao tác ghi W(x2), trường hợp (b)
thể hiện thao tác ghi W(x1) chưa
được lan tỏa đến bản sao L2
do đó không đảm bảo tính nhất quán giữa hai
bản sao này.
Mô hình nhất quán ghi sau
khi đọc đảm bảo rằng người dùng
sẽ luôn thực hiện thao tác ghi lên một mục dữ
liệu mà ít nhất cũng phải mới hơn phiên
bản cuối cùng của mục dữ liệu đó, lan
truyền cập nhật phải dựa trên kết quả
đọc.
|

|

|
|
(a)
Nhất quán ghi sau khi đọc
|
(b) Không đảm bảo nhất quán
ghi sau khi đọc
|
Hình 8.17 Mô hình nhất quán
ghi sau khi đọc
Hình 8.17 minh họa
tiến trình thực hiện thao tác ghi W(xi) sau
đó thực hiện thao tác đọc R(xi) trên
bản sao khác, trường hợp (a) thao tác W(x1;x2)
thể hiện thao tác ghi W(x1) đã được
lan tỏa đến bản sao L2, tiến trình
đọc được kết quả thao tác ghi W(x1)
sau đó mới thực hiện thao tác ghi W(x2). Trường
hợp (b) thể hiện thao tác ghi W(x1) chưa
được lan tỏa đến bản sao L2
do đó không đảm bảo tính nhất quán giữa hai
bản sao này. Có thể lấy ví dụ về thảo
luận nhóm, các thành viên chỉ có thể đưa ra góp ý
sau khi đã nhìn thấy chủ đề thảo luận.
Trước khi nhân bản trong các hệ
thống phân tán cần phải trả lời các câu
hỏi: ở đâu, khi nào và
cho ai và sau đó là các cơ chế dùng để duy trì tính
nhất quán của các bản sao. Câu hỏi đặt
bản sao ở đâu sẽ gồm hai phần: vị trí máy
chủ của bản sao và nội dung được
lưu trữ trên bản sao đó, sự khác biết không
dễ mô tả nhưng quan trọng và chúng không tách biệt
nhau một cách rõ ràng. Vị trí đặt máy chủ
bản sao liên quan tới việc tìm kiếm vị trí
tốt nhất để đặt máy chủ lưu
trữ dữ liệu, nội dung được lưu
trữ liên quan đến vấn đề tìm kiếm máy
chủ tốt nhất để lưu trữ nội dung,
thông thường đó là tìm kiếm vị trí tối
ưu cho mục dữ liệu.
Lựa
chọn vị trí đặt máy chủ bản sao dựa
trên kết quả phân tích các thuộc tính về mạng và
máy khách sao cho độ trễ truyền thông giữa máy
chủ và máy khách có thể đạt giá trị thấp
nhất. Tuy nhiên trong thực tế còn phải tính
đến các vấn đề thương mại chứ
không phải chỉ đơn thuần vấn đề
tối ưu truyền thông khách/chủ. Có nhiều cách khác
nhau để tính toán vị trí tốt nhất đặt
các máy chủ bản sao nhưng tựu chung lại
đều là vấn đề tối ưu tìm ra K vị
trí tốt nhất trong số N vị trí, những vấn
đề tính toán này phức tạp và chỉ có thể
được giải quyết thông qua kinh nghiệm. Ví
dụ có thể lấy khoảng cách giữa máy khách và máy
chủ để làm tiêu chí nhưng cũng có thể
lấy tiêu chí tối ưu là vùng tự trị, các
thuật toán này đều có chi phí tính toán cao. Năm 2006 Szymaniak đề xuất giải pháp bản
sao theo khu vực, một khu vực được xác
định bằng tập các nút truy nhập cùng nội
dung, tuy nhiên cần phải tính toán sao cho hạn chế sự
phân mảnh nội dung.
Bản sao nội dung có
thể chia thành ba loại: bản
sao thường trực, bản sao khởi đầu
từ máy chủ và các bản sao khởi đầu từ
máy khách.

Hình 8.18 Phân loại bản sao dữ
liệu
Các bản sao
thường trực có thể coi như tập khởi
đầu của các bản sao, chúng tạo nên kho dữ
liệu phân tán. Số lượng các bản sao
thường trực thường nhỏ, ví dụ khi cài
đặt trang web có thể tổ chức theo hai cách: nhóm
máy chủ web hoặc phân tán máy chủ. Cách thứ nhất sao
các tập tin của trang web lên các nhóm các máy chủ, khi có
yêu cầu gửi đến thì sẽ sử dụng
chiến lược round-robin để chuyển tới
một trong các máy chủ xử lý. Cách thứ hai là dùng
cơ chế phản chiếu, trang web sẽ
được nhân bản lên một số máy chủ phân
bố dựa theo vị trí địa lý trên toàn mạng
Internet, máy khách lựa chọn một trong các máy chủ
để truy nhập trang web.
Bản sao khởi nguồn
từ máy chủ được sử dụng để
làm tăng hiệu năng và chúng được tạo ra
xuất phát từ yêu cầu của kho dữ liệu, các
bản sao này được xếp đặt động
dựa vào yêu cầu của máy chủ khác. Ví dụ máy
chủ web đặt tại một vị trí, bình
thường vẫn xử lý các yêu cầu nhưng quản
trị viên nhận thấy có sự tăng trưởng
đột ngột từ một khu vực nào đó,
như vậy có thể nhân bản
trang web tạm thời lên các máy chủ ở những
khu vực có nhiều người truy nhập, quyết
định đặt nội dung ở đâu sẽ
dễ dàng hơn quyết định đặt máy
chủ. Giải thuật nhân bản động giải
quyết hai vấn đề: giảm tải cho máy chủ
và đưa thông tin cần thiết gần với vị
trí của người dùng, mỗi máy chủ lưu vết
truy nhập của người dùng, dựa trên thông tin
về nội dung và vị trí truy nhập có thể quyết
định máy chủ nào gần với người dùng
nhất. Trên hình 8.19, tập tin F đặt tại máy
chủ Q nhưng nhiều người dùng truy nhập
đến tập tin này phải đi qua máy chủ P,
nếu số lượng truy nhập qua P lớn hơn
ngưỡng nhân bản thì sẽ tạo bản sao tập
tin F trên máy chủ P. Nếu số lượng truy nhập
đến tập tin F trên máy chủ Q không vượt qua
ngưỡng xóa thì hoàn toàn có thể loại bỏ tập
tin này trên máy chủ Q, như vậy sẽ giảm số
lượng các bản sao.

Hình 8.19 Đếm số
lượng yêu cầu từ máy khách
Ngưỡng nhân
bản luôn có giá trị lớn hơn ngưỡng xóa,
số lượng yêu cầu lớn hơn ngưỡng
nhân bản nghĩa là sẽ tốt hơn nếu
đặt tài nguyên trên máy chủ khác. Nếu số
lượng yêu cầu nằm trong khoảng ngưỡng
xóa và ngưỡng nhân bản thì nên tạo thêm bản sao
cho tài nguyên. Tuy nhiên việc di chuyển tài nguyên có kích
thước lớn từ máy chủ này sang máy chủ khác
không phải lúc nào cũng thực hiện được,
trong trường hợp này phải thực hiện cơ
chế nhân bản. Bản sao thường trực vẫn
thường được sử dụng với mục
đích dự phòng hoặc với mục đích
đảm bảo tính nhất quán, các bản sao khởi
nguồn từ máy chủ dùng để thay thế các bản
sao chỉ đọc cho máy khách.
Một loại bản
sao quan trọng là bản sao khởi nguồn từ máy
khách, chúng được tạo ra từ yêu cầu của
những ứng dụng nằm trên chính máy khách, chẳng
hạn như việc ghi nhớ dữ liệu cache,
bản chất đó là vùng nhớ để máy khách
tạm thời lưu dữ liệu vừa yêu cầu. Về
nguyên tắc, việc quản lý cache hoàn toàn dành cho máy khách,
kho dữ liệu không có việc gì phải duy trì tính
nhất quán, tuy nhiên trong nhiều trường hợp máy
khách có thể dựa vào sự tham gia của kho dữ
liệu để thông báo cho nó khi nào dữ liệu cache
đã cũ. Dữ liệu cache của máy khách dùng
để cải thiện thời gian truy nhập dữ
liệu, chúng được xếp đặt động
tùy thuộc vào yêu cầu của người sử
dụng các ứng dụng trên máy khách. Bình thường khi
máy khách truy nhập dữ liệu nào đó, nó kết
nối đến bản sao gần nhất của kho
dữ liệu đã lấy ra và muốn đọc
hoặc nơi nó đã thay đổi. Nếu là hệ
thống khai phá dữ liệu, hiệu năng có thể
cải thiện bằng cách cho phép máy khách lưu dữ
liệu đã yêu cầu trong cache ở vị trí gần,
như vậy có thể lưu trên chính máy khách hoặc trên
máy tính trong mạng cục bộ cùng với máy khách,
những lần kế tiếp dữ liệu sẽ
được lấy từ cache cục bộ,
phương pháp này sẽ hoạt động tốt
nếu không có bất kỳ sự thay đổi dữ
liệu nào trong khoảng thời gian đó. Nói chung dữ
liệu trong cahe được giữ một thời gian
nhất định để tránh dữ liệu quá cũ
hoặc để dành bộ nhớ cho các máy khách khác.
Quản lý bản sao
cũng phải giải quyết vấn đề lan
truyền cập nhật nội dung đến các máy
chủ nhân bản tương ứng, phần này sẽ
giới thiệu các phương pháp thực hiện yêu
cầu này.
Vấn đề quan trọng liên quan
đến những gì cần phải lan tỏa, về
cơ bản có ba khả năng sau:
-
Lan truyền thông báo đã xuất hiện
thao tác cập nhật
-
Truyền dữ liệu cập nhật
từ bản sao này tới một bản sao khác
-
Lan truyền thao tác cập nhật tới
các bản sao khác
Lan truyền thông báo đã
xuất hiện thao tác cập nhật là những giao
thức thông báo mất hiệu lực, các bản sao
được thông báo đã xuất hiện thao tác cập
nhật và dữ liệu trên các bản sao đó không còn
hiệu lực, nó có thể xác định phần nào
của kho dữ liệu đã được cập
nhật và như vậy chỉ có một phần của
bản sao thực sự đã mất hiệu lực.
Bất cứ khi nào yêu cầu thao tác cập nhật
bản sao mất hiệu lực, bản sao đó nói chung
cần được cập nhật đầu tiên,
phụ thuộc vào mô hình nhất quán cụ thể
được hỗ trợ. Ưu điểm chính
của phương pháp này là lượng thông tin nhỏ nên
sử dụng ít băng thông, chỉ có thông tin xác
định những dữ liệu nào không còn hiệu
lực được truyền đi. Các giao thức
loại này hoạt động tốt khi số lượng
các thao tác cập nhật lớn hơn rất nhiều so
với các thao thác đọc, nghĩa là tỉ lệ thao
tác đọc so với thao tác ghi tương đối
nhỏ. Phương pháp này cũng phù hợp với
những trường hợp dung lượng cần
cập nhật lớn, chuyển dữ liệu đến
các bản sao sẽ phải chi phí lượng lớn
thời gian và như vậy sẽ ảnh hưởng
đến hiệu năng của hệ thống. Ví dụ
trường hợp hai cập nhật liên tiếp xảy
ra trên một bản sao, kết quả thao tác cập
nhật thứ hai sẽ ghi đè lên kết quả cập
nhật thứ nhất, do đó việc thông báo cập
nhật sẽ hiệu quả hơn nhiều so với
việc chuyển dữ liệu cập nhật.
Truyền dữ liệu đã
bị thay đổi giữa các bản sao là khả
năng lựa chọn thứ hai, nó thực hiện tốt khi tỉ
lệ thao tác đọc so với thao tác ghi tương
đối cao. Trong trường hợp xác xuất cập
nhật cao và áp dụng mô hình nhất quán đọc
trước khi ghi thì có thể ghi lại những thay
đổi và chỉ truyền những thay đổi
đó để tiết kiệm băng thông, hơn nữa
có thể tập hợp chúng thành một thông điệp và
truyền đi, như vậy cũng sẽ tiết
kiệm thông tin điều khiển. Giải pháp thứ ba
không truyền dữ liệu đã thay đổimar báo cho
mỗi bản sao biết cần phải thực hiện
thao tác cập nhật nào, chỉ truyền đi những
giá trị của tham số cân thiết cho những thao tác
đó. Cách tiếp cận này còn gọi là nhân bản
chủ động, với giả thiết mỗi bản
sao đại diện cho tiến trình có khả năng
đảm bảo dữ liệu có liên quan sẽ
được cập nhật bằng cách thực hiện
các thao tác. Ưu điểm của phương pháp này là
việc lan truyền cập nhật có thể
được thực hiện với chi phí băng thông
tối thiểu, dung lượng dữ tham số liên quan
tới thao tác tương đối nhỏ. Hơn nữa
các thao tác có thể phức tạp tùy ý, điều này cho
phép cải thiện hơn nữa trong việc giữ tính
nhất quán của các bản sao. Mặt khác mỗi bản
sao có thể đáp ứng năng lực xử lý lớn
hơn, đặc biệt trong những trường
hợp các thao tác tương đối phức tạp.
Một vấn đề
khác khi thiết kế cơ chế nhân bản nội dung
là lựa chọn phương thức kéo hay phương
thức đẩy. Cách tiếp cận đẩy còn
gọi là giao thức dựa trên máy chủ, các cập
nhật được lan truyền đến các bản
sao mà không cần gửi yêu cầu cập nhật. Giải
pháp này thường được sử dụng cho các
bản sao thường trực và các bản sao khởi
nguồn từ máy chủ, nó cũng được sử
dụng cho các bản sao khởi nguồn từ máy khách. Nói
chung, giao thức dựa trên máy chủ được áp
dụng cho các bản sao cần duy trì mức độ
nhất quán tương đối cao, cần phải
giữ các bản sao y hệt nhau. Nhu cầu về mức
độ nhất quán cao liên quan tới thực tế các
bản sao thường trực và các bản sao khởi
nguồn từ máy chủ cũng như dữ liệu cache
của nhiều máy khách chủ yếu thực hiện thao
tác đọc, nghĩa là tỉ lệ thao tác đọc so
với thao tác cập nhật tương đối cao, do
đó giao thức đẩy cập nhật sẽ hiệu
quả vì nó làm cho dữ liệu nhất quán ngay khi có yêu
cầu.
Cách tiếp cận kéo
cập nhật còn gọi là giao thức dựa trên máy khách,
máy chủ hoặc máy khách yêu cầu máy chủ khác gửi
cho nó các cập nhật còn tồn đọng, phương
pháp này thường dùng cho các bản sao khởi nguồn
từ máy khách. Ví dụ cơ chế cache, khi có yêu cầu
từ máy khách gửi đến, cache sẽ hỏi máy
chủ xem dữ liệu đang lưu trong nó có bị thay
đổi hay không, nếu không có thay đổi thì nó
sẽ chuyển ngay dữ liệu cho máy khách, nếu có thay
đổi thì phải lấy dữ liệu mới
đưa vào cache sau đó mới trả về cho máy khách,
nói cách khác máy khách đã thăm dò máy chủ để
biết có cần phải cập nhật hay không. Cách
tiếp cận kéo sẽ hiệu quả khi tỉ lệ
giữa thao tác đọc và thao thác ghi tương
đối thấp, đó thường là trường
hợp cache riêng của máy khách hoặc cache chung của
nhiều máy khách nhưng ít chia sẻ các mục dữ
liệu. Nhược điểm cơ bản của cách
tiếp cận kéo so với cách tiếp cận đẩy
là thời gian trả lời sẽ tăng lên trong
trường hợp mất cache, hai cách tiếp cận này
có những điểm khác biệt như sau:
|
Vấn đề
|
Đẩy
|
Kéo
|
|
Trạng thái trên máy chủ
|
Danh sách các bản sao
|
Không cần
|
|
Thông điệp trao
đổi
|
Cập nhật
|
Thăm dò và cập nhật
|
|
Thời gian trả
lời
|
Ngay lập tức hoặc
thời gian lấy dữ liệu
|
Thời gian lấy dữ liệu
|
Một vấn đề quan trọng trong
giao thức đẩy, máy chủ phải lưu vết
tất cả cache của máy khách, bên cạnh khả
năng chịu lỗi của máy chủ sẽ thấp
hơn thì việc duy trì cache của các máy khách cũng làm
tăng đắng kể lượng thông tin điều
khiển. Ví dụ trường hợp máy chủ web, khi
cập nhật trang thì máy chủ sẽ phải thực
hiện cập nhật toàn bộ cache của máy khách,
điều này làm tăng đáng kể lưu lượng
truyền thông. Thông điệp trao đổi giữa máy
khách và máy chủ cũng khác nhau, trong cách tiếp cận
đẩy thì chỉ có máy chủ gửi các thao tác cập
nhật cho máy khách, chỉ khi nào đó là những yêu
cầu cập nhật thì máy khách mới phải lấy
những dữ liệu đã thay đổi. Trong cách
tiếp cận kéo, máy khách phải thăm dò máy chủ xem
có cần thiết lấy dữ liệu đã bị thay
đổi hay không. Cuối cùng, thời gian trả lời
tại máy khách cũng khác nhau, nếu máy chủ đẩy
dữ liệu thay đổi về máy khách thì thời gian
đáp ứng tại phía máy khách gần như bằng 0,
nếu dữ liệu trên máy khách không còn hiệu lực thì
thời gian đáp ứng sẽ giống như cách
tiếp cận kéo, đó là thời gian lấy dữ
liệu từ máy chủ về máy khách.
Việc cân bằng hai cách tiếp cận này
dẫn đến một dạng lai ghép lan truyền
cập nhật dựa trên khái niệm thời gian quá
hạn cho nội dung, máy chủ sẽ đẩy cập
nhật đến các máy khách sau một thời gian
nhất định, khi quá thời gian đó thì máy khách
sẽ buộc phải hỏi máy chủ về cập
nhật và nếu có dữ liệu thay đổi thì kéo
về hoặc máy khách sẽ gia hạn thêm thời gian
đẩy cập nhật. Việc tính toán thời gian quá
hạn dựa trên các tiêu chí khác nhau, ví dụ có thể
dựa trên thời gian cập nhật cuối cùng, nếu
một mục dữ liệu nào đó không thay đổi
trong một khoảng thời gian dài thì có thể tăng
thời gian quá hạn, như vậy sẽ giảm đáng
kể các thông điệp cập nhật. Cũng có thể
dựa vào số lượng yêu cầu của máy khách
để quyết định thời gian quá hạn
hoặc thậm chí quyết định có lưu trạng
thái của máy khách hay không, tần suất yêu cầu càng
nhiều chứng tỏ máy khách càng cần phải
được đảm bảo tính nhất quán. Những
máy khách đã được máy chủ lưu trạng thái
nếu càng gửi nhiều yêu cầu thì càng tăng
thời gian quá hạn, yêu cầu cập nhật vẫn
sẽ được chuyển đến các máy khách này khi
có sự thay đổi nội dung mặc dù chưa hết
thời gian quá hạn. Tiêu chí cuối cùng là không gian trạng
thái tại máy chủ, khi máy chủ quá tải thì phải
hạ thấp thời gian quá hạn để máy chủ
giảm số lượng máy khách cần phải lưu
trạng thái, thậm chí máy chủ có thể chuyển sang
dạng không trạng thái, nghĩa là sẽ không lưu
trạng thái của bất kỳ máy khách nào.
Liên quan tới việc đẩy hay kéo
cập nhật thì phải quyết định sử
dụng phương pháp truyền thông
điểm-điểm hay truyền theo nhóm, nếu sử
dụng phương pháp thứ nhất thì máy chủ kho
dữ liệu sẽ phải gửi thông điệp
cập nhật riêng rẽ cho từng bản sao, nếu
sử dụng phương pháp thứ hai thì các thông
điệp sẽ dựa trên mạng và thông điệp
sẽ được gửi đến các bản sao
một cách hiệu quả, đa số các trường
hợp sử dụng các phương tiện truyền theo
nhóm sẵn có, nếu các bản sao nằm trong mạng
cục bộ thì sự khác biệt giữa các phương
pháp truyền không đáng kể. Phương pháp truyền
theo nhóm thường có hiệu quả khi sử dụng kèm
với cách tiếp cận đẩy để lan
truyền cập nhật, nếu tích hợp cẩn
thận thì chỉ cần sử dụng một nhóm.
Ngược lại, cách tiếp cận kéo thông thường
do một máy khách hoặc máy chủ yêu cầu bản sao
được cập nhật, trong trường hợp
này giải pháp truyền điểm điểm sẽ
hiệu quả nhất.
Các mô hình nhất quán và
những vấn đề thiết kế giao thức
nhất quán đã được giới thiệu trong
những phần trên, phần này sẽ tập trung cho
việc cài đặt thực tế các mô hình nhất quán
bằng cách triển khai một số giao thức nhất
quán. Giao thức nhất quán mô tả cách cài đặt mô
hình nhất quán riêng, trước hết sẽ xem xét
dưới khía canh mô hình nhất quán lấy dữ liệu
làm trung tâm sau đó sẽ đề cập tới các giao
thức cho mô hình lấy máy khách làm trung tâm.
Các
giao thức nhất quán liên tục dựa trên các giải
pháp của mô hình nhất quán liên tục, Yu và Vahdat trong các công trình
nghiên cứu về tính nhất quán liên tục đã phát
triển một số giao thức để giải
quyết ba tiêu chí nhất quán, đó là những
tiêu chí về sai số giữa các bản sao, chênh lệch trạng thái và thứ
tự các thao tác cập nhật.
Giả
sử cần cập nhật mục dữ liệu x, mỗi
thao tác cập nhật W(x) được gán trọng số
weight(W), để đơn giản giả thiết weight(W)>0.
Mỗi thao tác ghi ban đầu được chuyển
đến một trong số N máy chủ bản sao và máy chủ
này trở thành gốc của thao tác ghi, ký hiệu origin(W).
Nếu xét hệ thống tại một thời điểm
sẽ thấy một số cập nhật cần phải
được lan tỏa đến tất cả các máy chủ.
Mỗi máy chủ Si sẽ lưu vết nhật ký
Li của các thao tác cập nhật được
thực hiện trên bản sao cục bộ của mục
dữ liệu x. Giả sử TW[i,j] là các thao tác cập nhật
được thực hiện trên máy chủ Si với
yêu cầu xuất phát từ máy chủ Sj:
TW[i,j] = ∑{weight(W) | origin(W) = Sj
& W Є log(Si )}
Mục đích cần đạt là với bất kỳ thời gian
t nào thì giá trị Vi tại máy chủ Si xê
dịch trong khoảng giá trị thực v(t) của mục
dữ liệu x, giá trị thực này được quyết
định bởi tất cả các thao tác cập nhật,
nghĩa là nếu v(0) là giá trị ban đầu của mục
dữ liệu x thì giá trị thực v(t) của mục dữ
liệu x được tính theo công thức:
N
v(t) = v(0) + ∑ TW[k,k]
k=1
và giá trị Vi của bản
sao i:
N
v(i) = v(0) +
∑ TW[i,k]
k=1
Tập trung vào độ
lệch tuyệt đối, kết hợp cận trên δi cho mỗi máy chủ Si, như vậy
cần phải đảm bảo v(t)
– vi ≤ δi. Các thao tác cập nhật
gửi đến máy chủ Si sẽ
phải lan truyền đến các máy chủ khác, có
nhiều cách thực hiện nhưng thông thường
sử dụng giao thức bệnh dịch sẽ cho phép phổ biến các
cập nhật nhanh nhất, ý tưởng cơ
bản của thuật toán lan truyền như sau:
-
Giả thiết không xảy ra
xung đột giữa các thao tác ghi-ghi.
-
Các thao tác cập nhật ban
đầu được thực hiện chỉ trên
một số bản sao.
-
Một bản sao chỉ gửi
các cập nhật của nó tới tập hữu hạn
hàng xóm.
-
Việc lan truyền các cập
nhật xảy ra chậm chạp và không phải ngay
lập tức.
-
Cuối cùng thì mỗi cập
nhật cũng đến được từng bản
sao.
Dựa trên thuật toán
bệnh dịch mà có các mô hình lan truyền cập nhật,
điều đáng lưu ý trong mô hình này là các cập
nhật được lan truyền tới các bản sao
với số lượng thông điệp càng ít càng tốt
và càng nhiều bản sao bị nhận được các
lan truyền càng nhanh càng tốt, cuối cùng nếu bản
sao nào không lan truyền được cập nhật
của mình thì nó sẽ bị loại bỏ. Một trong
những mô hình lan truyền cập nhật gọi là anti
entropy, mỗi bản sao cứ định kì lại chọn
ngẫu nhiên một bản sao khác và trao đổi các
trạng thái khác nhau của mình, sau một thời gian thì
cả hai bên sẽ có những trạng thái giống hệt
nhau. Một mô hình khác là gossiping, trong mô hình này mỗi bản
sao thực hiện các thao tác cập nhật sẽ gửi
cho các bản sao khác những cập nhật đó.
Trong mọi
trường hợp khi máy chủ Si lan truyền
cập nhật xuất phát từ máy chủ Sj đến
máy chủ Sk thì máy chủ sau sẽ có thể học
được giá trị TW[i,j] tại thời điểm
gửi thao tác cập nhật, nói cách khác Sk có thể duy
trì cách nhìn nhận TWk[i,j] mà nó tin cậy
Sj, sẽ có giá
trị TW[i,j], rõ ràng 0 ≤ TWk[i,j] ≤ TW[i,j] ≤ TW[j,j]. Khi máy chủ Sk nhận
thấy máy chủ Sj không giữ
được nhịp độ cập nhật đã
chuyển đến Sk, nghĩa là TWk[i,k] khác xa TW[k,k],
đặc biệt nếu TW[k,k]-TWk[i,k] > δj/(N-1), máy chủ Sk sẽ
chuyển tiếp các thao tác cập nhật đã lưu
trong nhật ký của nó đến Sj. Việc chuyển tiếp
này sẽ cải thiện đáng để cách nhìn TWk[i,k] mà Sk đã có
của TW[i,k], làm cho độ lệch TW[i,k] - TWk[i,k] nhỏ
hơn. Đặc biệt, Sk cải
thiện cách nhìn của nó trên TW[i,k] khi ứng dụng
đệ trình thao tác cập nhật mới làm tăng TW[k,k]-TWk[i,k]
vượt quá δj/(N-1), việc cải thiện
luôn đảm bảo v(t) – vi
≤ δi.
Có nhiều
cách để giữ trạng thái của các bản sao trong
giới hạn xác định, một trong những cách
đơn giản là cho phép máy chủ Sk giữ
đồng hồ vector theo thời gian thực RVCk
trong đó RVCk[i] = T(i). nghĩa là máy chủ Sk
đã nhìn thấy tất cả các thao tác cập nhật
đã gửi cho nó đến thời điểm T(i),
với giả thiết các thao tác cập nhật
được gán nhãn thời gian và T(i) là nhãn thời gian
cục bộ của máy chủ Si. Khi máy chủ Sk
nhận thấy T(i)-RVCk[i] vượt quá giới
hạn xác định thì nó chỉ cần kéo các thao tác
cập nhật xuẩt phát từ Si với nhãn
thời gian lớn hơn RVCk[i]. Trong trường
hợp này máy chủ bản sao có trách nhiệm giữ cho
mục dữ liệu được cập nhật
mới nhất bất chấp các thao tác cập nhật xuất
phát từ đâu, ngược lại với giải pháp
giới hạn sai số cho phép máy chủ gốc giữ
các bản sao luôn được cập nhật mới
nhất bằng cách chuyển tiếp các thao tác cập
nhật. Trường hợp giới hạn chênh lệch
trạng thái, thao tác đẩy cập nhật không
đảm bảo tính nhất quán vì không biết trước
thời gian lan truyền cập nhật tối đa
sẽ là bao nhiêu, vì vậy thao tác kéo cập nhật sẽ
cải thiện tình huống này do nhiều máy chủ cùng
giúp giữ cho bản sao mục dữ liệu
được cập nhật mới nhất.
Nguyên nhân độ lệch
thứ tự trong nhất quán liên tục là do máy chủ
bản sao đang tạm thời thực hiện những
thao tác cập nhật đã gửi cho nó, nghĩa là các thao
tác này chưa được khẳng định, chúng
đang ở trong hàng đợi cục bộ và thứ
tự thực sự của chúng đang phải chờ
để được quyết định, độ
lệch thứ tự được giới hạn
bằng cách xác định chiều dài tối đa của
hàng đợi các thao tác cập nhật chưa
được khẳng định. Như vậy việc
phát hiện vi phạm nhất quán thứ tự xảy ra
khi chiều dài hàng đợi này vượt quá chiều dài
tối đa đã xác định trước, tại
thời điểm đó máy chủ sẽ không tiếp
nhận thêm các thao tác cập nhật mới gửi
đến, máy chủ sẽ cố gắng thực
hiện khẳng định bằng cách đàm phán với
các máy chủ khác về thứ tự của các thao tác
đang chờ khẳng định. Nói cách khác, cần
phải bắt buộc các máy chủ nhất quán toàn cục
thứ tự các thao tác đang chờ khẳng
định, điều này trong thực tế thực hiện bằng các giao
thức dựa trên bản chính hoặc giao thức dựa
trên việc biểu quyết.
Trong thực tế, tính
nhất quán trong các ứng dụng phân tán nói chung
được xây dựng theo mô hình giới hạn
độ lệch trạng thái hoặc độ lệch
sai số bởi vì đó là những mô hình tương
đối dễ hiểu. Khi nói đến các mô hình xử
lý nhất quán theo thứ tự của các thao tác thì thông
thường chúng được
gộp thành nhóm thông qua khóa hoặc giao tác. Nếu mô
hình nhất quán hơi khó hiểu, dù cho mô hình đó có
cải thiện hiệu năng thì những người
phát triển phần mềm cũng không muốn áp dụng.
Điểm mấu chốt nằm ở chỗ nếu
ngữ nghĩa của mô hình nhất quán không trực quan rõ
ràng thì cũng sẽ tốn nhiều thời gian để
xây dựng các ứng dụng chính xác, tính đơn
giản cần phải được đề cao.
Trường hợp
nhất quán tuần tự cho thấy giao thức dựa
trên bản chính chiếm ưu thế, mỗi mục
dữ liệu được gắn với một bản
chính và bản chính đó có trách nhiệm điều
phối thao tác ghi trên tất cả các bản sao của
mục dữ liệu. Nhân bản dựa trên bản chính
thuộc về nhóm nhất quán tuần tự, một
bản sao dữ liệu được chỉ
định đóng vai trò chủ đạo cập nhật
dữ liệu, gọi là bản chính để phân biệt
với các bản sao khác. Cần phân biệt trường
hợp bản chính cố định trên một máy chủ
với trường hợp các thao tác cập nhật có
thể được thực hiện trên máy chủ cục
bộ sau khi chuyển mục dữ liệu từ bản
chính về tiến trình phát sinh thao tác cập nhật,
trường hợp thứ nhất gọi là giao thức
ghi từ xa và trường hợp thứ hai gọi là giao
thức ghi cục bộ.
Giao thức dựa trên
bản chính hỗ trợ nhân bản thực hiện theo
nguyên lý tất cả các thao tác cập nhật đều được
chuyển về một máy chủ cố định, các
thao tác đọc sẽ được thực hiện
cục bộ, những giao thức này còn gọi là các giao
thức sao lưu chính. Hình 8.20 minh họa trường
hợp cần phải cập nhật mục dữ
liệu x, tiến trình sẽ chuyển thao tác cập
nhật cho tiến trình trên máy chủ chính, sau khi hoàn thành
cập nhật cục bộ, tiến trình trên máy chủ
chính sẽ trả về kết quả cho tiến trình
khởi đầu thao tác cập nhật và đồng
thời lan tỏa cập nhật này tới các máy chủ
của các bản sao khác, các bản sao sau khi hoàn thành
cập nhật cục bộ cũng sẽ xác nhận
với máy chủ chính.

Hình 8.20 Giao thức ghi từ xa
Giao thức này thường
được kết hợp với các hệ thống
khách/chủ truyền thống, nhược điểm
cơ bản của nằm ở vấn đề
hiệu năng, thao tác cập nhật có thể thực
hiện tương đối lâu, tiến trình khởi
sướng yêu cầu cập nhật sẽ bị phong
tỏa trong thời gian đó, có thể khắc phục
bằng cách sử dụng cơ chế không phong tỏa.
Tuy nhiên nếu sử dụng cơ chế không phong tỏa
sẽ phải giải quyết các vấn đề liên
quan đến khả năng chịu lỗi, nếu
hoạt động dựa trên cơ chế phong tỏa thì
tiến trình máy khách sẽ tin chắc thao tác cập
nhật đã được hoàn thành trên tất cả các
bản sao. Giao thức dựa trên bản chính cung cấp
khả năng cài đặt trực tiếp mô hình nhất
quán tuần tự, máy chủ chính có thể sắp xếp
tất cả các thao tác cập nhật theo thứ tự
thời gian duy nhất trong toàn bộ hệ thống,
kết quả là các tiến trình sẽ nhìn thấy các thao
tác ghi theo cùng một thứ tự và sẽ không ảnh
hưởng đến kết quả các thao tác đọc
trên bất kỳ bản sao nào. Nếu sử dụng
cơ chế phong tỏa thì các tiến trình luôn nhìn thấy
kết quả của thao tác ghi gần nhất,
điều này sẽ không được đảm
bảo nếu sử dụng cơ chế không phong
tỏa.
Giao thức dựa trên bản
chính có thể thực hiện theo cách khác, bản sao chính di
chuyển giữa các tiến trình để thực
hiện thao tác ghi. Khi tiến trình muốn cập nhật
mục dữ liệu, nó lấy bản chính của mục
dữ liệu và chuyển về máy cục bộ
để xử lý, sau khi hoàn thành trên máy cục bộ
sẽ lan tỏa thao tác cập nhật đến tất
cả các bản sao khác. Ưu điểm của cách
tiếp cận này là nhiều thao tác cập nhật liên
tiếp có thể thực hiện cục bộ trong khi các
tiến trình khác vẫn có thể đọc bản sao
cục bộ của nó, có thể cải thiện hiệu
năng bằng phương thức không phong tỏa. Giao
thức này phù hợp cho các thiết bị di động
hay những nơi chất lượng mạng kém, chúng có
thể vận hành ngay cả khi không có kết nối
mạng.

Hình 8.21 Giao
thức ghi cục bộ
Trước
khi mất kết nối, thiết bị di động
trở thành máy chủ chính cho các mục dữ liệu
cần cập nhật, khi không được nối vào
mạng các thao tác cập nhật sẽ được
thực hiện cục bộ trong khi tiến trình trên các
máy khác chỉ được phép thực hiện thao tác
đọc, sau khi kết nối lại các thao tác cập
nhật sẽ được lan truyền đến các
bản sao để đưa kho dữ liệu về
trạng thái nhất quán. Nên tổ chức theo cách chọn
cố định một máy chủ trung tâm như
trường hợp giao thức ghi từ xa, máy chủ
tạm thời có thể cho phép một bản sao
được phép thực hiện các thao tác cập
nhật cục bộ, thực hiện xong thì chuyển
về máy chủ trung tâm để lan tỏa đến các
bản sao khác.
Trong các giao
thức này, thay cho việc cập nhật trên một
bản sao sau đó mới lan tỏa đến các bản
sao khác, thao tác cập nhật có thể được
tiến hành đồng thời trên nhiều bản sao. Một
tiến trình sẽ gán định danh cho mỗi thao tác
cập nhật và chuyển đến các bản sao, có
thể thực hiện bằng theo phường pháp nhân
bản tích cực hoặc biểu quyết theo đa
số.
Trong nhân
bản tích cực, mỗi bản sao kết hợp với
tiến trình thực hiện các thao tác cập nhật, các
thao tác cập nhật được gửi đến
đến tất cả các bản sao và được
thực hiện theo cùng một thứ tự, các thao tác
đọc được thực hiện cục bộ
trên mỗi bản sao. Ưu điểm của phương
pháp này là tất cả các bản sao đều đồng
thời nhận được các thao tác cùng thứ tự
và cũng không cần đánh dấu một bản chính hay
phải gửi tất cả các thao tác tới một máy
chủ. Tuy nhiên giao thức này lại đòi hỏi
phải truyền theo kiểu nhóm động hoặc
phải có một bộ sắp xếp dãy tập trung mà
cả hai phương pháp này đều khó có thể
tiếp cận một cách linh hoạt.
Như vậy
cần thiết phải sử dụng cơ chế
truyền theo nhóm có thứ tự, điều này có thể
thực hiện bằng cách gán nhãn thời gian logic, tuy nhiên
cơ chế này không phù hợp với những hệ
thống qui mô lớn, do đó có thể thay thế bằng
cách sử dụng tiến trình điều phối và
đồng thời đóng vai trò như một thành
phần sản sinh số tuần tự. Các thao tác cập
nhật sẽ được gửi đến tiến
trình điều phối, tại đây chúng được
gán số tuần tự và sau đó chuyển cho các bản
sao, các bản sao sẽ thực hiện thao tác theo số
tuần tự đã cấp. Việc sử dụng
tiến trình điều phối cũng không giải
quyết được vấn đề quy mô, trong
thực tế cần phải kết hợp việc truyền
theo nhóm với gán nhãn thời gian logic.
Cách tiếp
cận khác sử dụng kết quả bỏ phiếu
để hỗ trợ thực hiện nhân bản thao tác
ghi, máy khách yêu cầu các máy chủ cấp quyền
được cập nhập trước khi thao tác
với mục dữ liệu, giao thức dựa trên
đại diện thực hiện các thao tác ghi trên một
tập nhỏ nhất các bản sao. Ví dụ để được
quyền cập nhật mục dữ liệu, máy khách
phải nhận được sự chấp thuận
của đa số các máy chủ bản sao, khi đã
được cấp quyền thì tiến hành cập
nhật và đồng thời đánh dấu phiên bản
cho mục dữ liệu để thao tác đọc có
thể nhận biết được phiên bản mới
nhất. Trong giao thức này, tất cả các mục
dữ liệu được kết hợp với một
số phiên bản, mỗi lần một mục bị
sửa đổi thì số phiên bản của nó cũng
được tăng lên. Khi thực hiện một thao
tác đọc, máy khách cũng phải liên hệ với các
bản sao để tìm ra phiên bản mới nhất
của dữ liệu.

Hình 8.22 Giao
thức dựa trên đại biểu
Gifford đã tổng quát hóa
cách tiếp cận dựa trên đại diện, giao
thức này định nghĩa ra số đại biểu
đọc và số đại biểu ghi, hai đại
biểu này sẽ xác định số bản sao phải
được liên hệ trước khi thực hiện
thao tác đọc và ghi. Số đại biểu
đọc phải lớn hơn ½ tổng số bản
sao, vì thế tổng của số đại biểu
đọc và ghi phải lớn hơn tổng số
bản sao. Bằng cách này, máy khách muốn thực hiện
một thao tác đọc thì phải đảm bảo
việc liên hệ với ít nhất một bản sao có
chứa phiên bản mới nhất của mục dữ
liệu. Việc lựa chọn số lượng
đại biểu dựa vào tỉ lệ giữa thao tác
đọc và ghi cùng với chi phí khi thực hiện
phương pháp giao tiếp giữa các nhóm. Giả sử
hệ thống gồm N bản sao, ký hiệu Nr là
tập các máy chủ bản sao tùy ý để đọc và
Nw là tập các máy chủ bản sao chấp
thuận thao tác cập nhật, khi đó phải thỏa
mãn hai điều kiện:
1.
Nr + Nw > N
2.
Nw >
N/2
Điều
kiện thứ nhất tránh xung đột đọc-ghi,
điều kiện thứ hai tránh xung đột ghi-ghi,
chỉ khi nào thỏa mãn các điều kiện này thì
mới được phép đọc hoặc ghi. Ví dụ
trên hình 8.22, trường hợp (a) Nr=3 và Nw = 10,
như vậy phiên bản mới nhất xuất hiện
trên 10 bản sao, sẽ có ít nhất một thành viên trong
tập Nr cũng
sẽ là thành viên của tập Nw máy khách sẽ
tìm được phiên bản mới nhất và tìm ra máy
chủ bản sao nào chứa phiên bản mới nhất.
Trường hợp (b) có thể xảy ra xung đột
ghi-ghi vì Nw=
N/2, trường hợp (c) thể hiện đọc
một và ghi tất cả, có thể đọc bất
kỳ máy chủ nào cũng được bản sao
mới nhất.
Bộ nhớ cache là
trường hợp đặc biệt trong nhân bản, theo
ngữ nghĩa, nói chung chúng chịu sự kiểm soát
của máy khách chứ không phải máy chủ. Tuy nhiên, các
giao thức gắn kết bộ nhớ cache đảm
bảo chúng nhất quán với các bản sao khởi
nguồn từ máy chủ, về nguyên lý các giao thức thức
này không khác biệt nhiều so với các giao thức
nhất quán. Đã có nhiều công trình nghiên cứu về
việc thiết kế và cài đặt bộ nhớ cache,
đặc biệt trong ngữ cảnh các hệ thống
nhiều bộ xử lý chia sẻ bộ nhớ, nhiều
giải pháp dựa vào sự hỗ trợ của phần
cứng. Trong ngữ cảnh
các hệ thống phân tán dựa vào tầng trung gian xây
dựng trên các hệ điều hành đa năng, các
giải pháp dựa trên phần mềm có nhiều
điểm thú vị hơn, trong trường hợp này
hai tiêu chí riêng biệt thường được duy trì
để phân loại các giao thức lưu trữ bộ
nhớ cache. Thứ nhất, các giải pháp lưu giữ
bộ nhớ cache có thể khác nhau trong chiến
lược phát hiện tính gắn kết của chúng,
nghĩa là phát hiện xác định khi nào thực sự phát
hiện ra tính không nhất quán, có hai cách thực hiện như
sau:
-
Phát hiện tĩnh: Chương trình biên
dịch thực hiện các phân tích cần thiết
trước khi thực hiện và quyết định
những mục dữ liệu nào thực sự không
nhất quán, như vậy phần mềm biên dịch
chỉ cần thêm vào một số chỉ thị lệnh
đảm bảo tính nhất quán.
-
Phát hiện động: Thường áp
dụng trong các hệ thống phân tán, sự không nhất
quán sẽ bị phát hiện trong thời gian chạy, ví
dụ kiểm tra dữ liệu trên máy chủ để biết
mục dữ liệu có bị thay đổi kể từ
thời điểm thực hiện lưu giữ cache.
Trong cơ sở
dữ liệu phân tán, các giao thức phát dựa trên phát
hiện động có thể tiếp tục phân loại
bằng cách xem xét chính xác khi nào phát hiện ra sự không
nhất quán trong thời gian thực hiện giao tác, chúng
gồm ba loại sau:
-
Khi đang thực hiện giao tác, máy khách
truy nhập vào mục dữ liệu bộ nhớ cache và
cần phải kiểm tra tính nhất quán với phiên
bản đang lưu trên máy chủ, giao tác sẽ không
thể tiếp tục sử dụng phiên bản đang
lưu giữ cho đến khi hoàn thành việc kiểm tra
tính nhất quán.
-
Giao tác tiếp tục thực hiện trong
khi đang thực hiện kiểm tra, đây
được coi là cách tiếp cận lạc quan, nó
giả thiết dữ liệu trong cache đã được
cập nhật mới nhất trước khi giao tác
bắt đầu, nếu sau đó chứng minh
được giả thiết trên là sai thì sẽ hủy bỏ
giao tác.
-
Thực hiện kiểm tra dữ liệu
đã lưu trong cache đã được cập nhật
mới nhất trước khi thực hiện khẳng
định giao tác, đây cũng được coi là cách
tiếp cận lạc quan, giao tác bắt đầu
bằng cách thao tác trên dữ liệu hiện hành của
bộ nhớ cache với niềm tin đó là dữ
liệu mới nhất, sau khi hoàn thành các bước
chuẩn bị thì kiểm tra tính nhất quán của các
mục dữ liệu đã sử dụng, nếu đó là
dữ liệu cũ thì hủy bỏ giao tác.
Một vấn
đề khác của giao thức gắn kết bộ
nhớ cache là chiến lược ép buộc gắn
kết, nó quyết định phương pháp duy trì tính
nhất quán giữa bộ nhớ cache với dữ
liệu lưu trên các máy chủ. Cách đơn giản
nhất là cấm tất cả dữ liệu chia sẻ
lưu giữ trên bộ nhớ cache, dữ liệu chia
sẻ chỉ được lưu tại các máy chủ,
tính nhất quán sẽ được đảm bảo
bằng các giao thức dựa trên bản chính hoặc các
giao thức nhân bản cập nhật, máy khách chỉ
được phép lưu bộ nhớ cache cho những
dữ liệu riêng, rõ ràng giải pháp này chỉ cải
thiện một phần hiệu năng. Nếu dữ
liệu chia sẻ được lưu trong bộ nhớ
cache, có hai cách tiếp cận để ép buộc tính
gắn kết, cách thứ nhất máy chủ gửi thông
điệp hết hiệu lực đến tất
cả các cache khi cập nhật mục dữ liệu, cách
thứ hai đơn giản chỉ cần lan truyền
cập nhật. Nhiều hệ thống cache sử
dụng cả hai cách này, lựa chọn động
giữa việc gửi thông báo hết hiệu lực hay
lan truyền cập nhật đôi khi được
sử dụng trong các cơ sở dữ liệu
khách/chủ.
Cuối cùng,
cần phải xem xét điều gì sẽ xảy ra khi
tiến trình thay đổi dữ liệu cache, nếu
sử dụng cache chỉ đọc thì các thao tác cập
nhật chỉ cẩn thực hiện trên máy chủ sau
đó sẽ sử dụng các giao thức phân phát
để đảm bảo các cập nhật lan
truyền đến cache. Trong nhiều trường
hợp cách tiếp cận kéo cập nhật sẽ
được sử dụng, máy khách phát hiện cache
đã lỗi thời và gửi yêu cầu đến máy
chủ để nhận được dữ liệu
mới nhất. Một giải pháp khác thường
được sử dụng trong các hệ thống
tập tin phân tán, cho phép các máy khách trực tiếp thay
đổi dữ liệu đã lưu giữ trong cache sau
đó chuyển cập nhật đến máy chủ.
Giải pháp này tương tự như giao thức cập
nhật cục bộ dựa trên bản chính trong đó
bộ nhớ cache của máy khách trở thành bản chính
tạm thời. Để đảm bảo tính nhất
quán, cần thiết phải cấp quyền cập
nhật riêng cho máy khách, nếu không có thể xảy ra xung
đột ghi-ghi. Thay đổi trực tiếp trên cache
cải thiện đáng kể hiệu năng vì các thao tác
được thực hiện cục bộ, có thể
cải tiến hơn nữa bằng cách gộp một
số thao tác cập nhật sau đó mới gửi
đến máy chủ.
Nếu bỏ qua yếu
tố hiệu năng thì việc cài đặt nhất quán
lấy máy khách làm trung tương đối dễ hiểu,
phần này sẽ giới thiệu một số cách cài
đặt có tính chất thực tiễn.
Trong cài đặt
đơn thuần nhất quán lấy máy khách làm trung tâm,
mỗi thao tác cập nhật W được gán một
định danh toàn cục duy nhất do máy chủ đưa
ra yêu cầu cập nhật qui định, trong nhất
quán liên tục máy chủ này gọi là nguồn Origin(W). Máy
chủ phải duy trì hai tập dữ liệu lưu
vết thao tác đọc và thao tác ghi cho mỗi máy khách. Đối với mô hình nhất
quán đọc đều, khi máy khách thực hiện thao
tác đọc trên máy chủ, máy chủ sẽ chuyển
đến tập thao tác đọc để kiểm tra
xem tất cả các định danh trên tập đọc
đã được cập nhật cục bộ hay
chưa, kích thước tập dữ liệu này có thể
ảnh hưởng tới vấn đề hiệu
năng. Nếu chưa được thực hiện, máy
chủ có thể liên hệ với các máy chủ khác
để cập nhật dữ liệu mới nhất
trước khi thực hiện thao tác đọc hoặc
chuyển tiếp yêu cầu cho máy chủ khác đã hoàn thành
các thao tác cập nhật. Sau khi hoàn thành thao tác đọc,
máy chủ sẽ thêm vào tập dữ liệu lưu
vết thao tác đọc một bản ghi tương
ứng với thao tác đọc mà máy khách đã yêu cầu.
Như vậy cần
phải quyết định chính xác các thao tác ghi đã xác
định trong tập thao tác đọc đã
được thực hiện ở đâu, ví dụ
định danh thao tác ghi có thể gồm định
đanh của máy chủ đã đệ trình thao tác
cập nhật. Máy chủ đó cần phải ghi nhật
ký các thao tác cập nhật sao cho chó thể thực
hiện lại trên máy chủ khác, hơn nữa các thao tác
cập nhật cần được thực hiện theo
thứ tự đã đệ trình. Việc sắp xếp
thứ tự có thể thực hiện bằng cách
để máy khách tạo ra số tuần tự duy
nhất trong hệ thống và gắn vào định danh
của thao tác cập nhật, nếu mỗi mục dữ
liệu chỉ có thể thay đổi bởi chủ
của nó thì sau này có thể cung cấp số tuần
tự.
Mô hình nhất quán ghi
đều cũng được cài đặt
tương tự như mô hình nhất quán đọc
đều, khi máy khách khởi sướng một thao tác
cập nhật trên máy chủ thì máy chủ sẽ chuyển
đến tập dữ liệu thao tác cập nhật
để kiểm tra xem thao tác cập nhật đó đã
từng được thực hiện hay chưa, kích
thước của tập này có thể rất lớn ảnh
hưởng đến các yêu cầu về hiệu năng,
nếu đó là yêu cầu mới thì máy chủ sẽ
thực hiện thao tác cập nhật thao đúng thứ
tự. Sau khi hoàn thành thao tác cập nhật mới,
định danh của thao tác sẽ được thêm vào
tập thao tác ghi, việc duy trì tập dữ liệu các
thao tác cập nhật sẽ làm tăng đáng kể
thời gian trả lời cho máy khách vì máy khách sẽ
chờ cho đến khi hoàn toàn thực hiện xong thao tác.
Nhất quán đọc
kết quả ghi đòi hỏi máy chủ thực hiện
thao tác đọc phải nhìn thấy tất cả các thao
tác ghi trong tập thao tác ghi cho máy khách, các thao tác ghi có
thể đơn giản lấy từ các máy chủ khác
trước khi thực hiện thao tác đọc, mặc
dù điều này có thể dẫn tới thời gian
đáp ứng kém. Cách thực hiện khác, phần mềm
trên máy khách có thể tìm kiếm máy chủ mà ở đó
đã hoàn thành các thao tác trong tập thao tác cập nhật
của máy khách. Nhất quán ghi theo sau đọc có thể
được cài đặt bằng cách trước
hết phải đảm bảo tất cả máy chủ
đã hoàn thành các thao tác cập nhật có trong danh sách
tập thao tác đọc, sau đó mới thêm định
danh của thao tác vào tập dữ liệu các thao tác
cập nhật.
Dễ dàng nhận thấy tập thao tác
đọc và ghi cho mỗi máy khách có thể sẽ rất
lớn, để duy trì việc quản lý những tập
này, các thao tác đọc và ghi của máy khách sẽ nhóm
lại thành các phiên. Mỗi phiên thường kết
hợp với một ứng dụng, mỗi phiên sẽ được
mở khi ứng dụng bắt đầu và đóng
lại khi thoát khỏi ứng dụng, mỗi phiên cũng
có thể kết hợp với tạm thời kết thúc.
Khi máy khách đóng phiên thì tập dữ liệu này cũng
sẽ bị xóa, tất nhiên nếu máy khách không bao giờ
đóng phiên thì tập dữ liệu này có thể vẫn
sẽ rất lớn. Vấn đề chính của cài
đặt đơn thuần nằm ở chỗ thể
hiện tập các thao tác đọc và ghi, mỗi tập
gồm một số định danh cho các thao tác ghi,
bất cứ khi nào máy khách chuyển yêu cầu đọc
hoặc ghi đến máy chủ, tập các cũng
được chuyển cho máy chủ để biết
các thao tác cập nhật tương ứng với yêu
cầu đọc đã được máy chủ đó
thực hiện hay chưa, thông tin này có thể
được thể hiện hiệu quả hơn
bằng cách sử dụng nhãn thời gian vector.
Khi máy chủ tiếp nhận một thao
tác cập nhật mới W, nó gán cho thao tác đó một
định danh và kèm theo nhãn thời gian ts(W), các thao tác
cập nhật sau đệ trình lên máy chủ đó sẽ
có giá trị cao hơn. Mỗi máy chủ Si duy trì
nhãn thời gian WVCi trong đó WVCi[j]
bằng với nhãn thời gian của thao tác cập
nhật gần nhất xuất phát từ máy chủ Sj
và đã được máy chủ Sj xử lý,
giả thiết các thao tác cập nhật từ máy chủ
Sj đều được xử lý theo thứ
tự đã đệ trình. Khi máy khách gửi yêu cầu
thực hiện thao tác đọc hoặc ghi tại
một máy chủ, máy chủ sẽ trả về kết
quả kèm theo nhãn thời gian của nó. Ví dụ cho mỗi
phiên A sẽ xây dựng nhãn thời gian vector SVCA với SVCA[i]
được đặt giá trị bằng nhãn thời
gian lớn nhất của tất cả các thao tác cập
nhật trong A xuất phát từ máy chủ Sj:
SVCA[j] =max{ts(W)|W ∈A & origin(W) =Sj}
Nói cách khác, nhãn thời gian của phiên luôn
luôn thể hiện các thao tác cập nhật mới
nhất, chúng được các ứng dụng đang
thực hiện nhìn thấy như một phần của
phiên. Tính cô đọng đạt được bằng
cách thể hiện tất cả các thao tác cập nhật
quan sát được xuất phát từ cùng máy chủ thông
qua một nhãn thời gian.
Ví dụ máy khách là một phần của
phiên A truy nhập vào máy chủ Si và chuyển SVCA cho Si,
giả thiết SVCA[j] > SVCi[j], nghĩa là
Si chưa nhìn thấy tất cả các thao tác
cập nhật xuất phát từ Sj
mà máy khách đã nhìn thấy. Tùy thuộc vào tính nhất quán
được yêu cầu, máy chủ Si
có thể lấy các thao tác cập nhật này trước
khi thông báo nhất quán cho máy khách. Khi hoàn thành thao tác, máy
chủ Si sẽ trả về nhãn thời gian của
nó WVCi, ở thời điểm này SVCA
được điều chỉnh SVCA[j]
=max{SVCA[j],WVCi[j]}. Một lần nữa chúng ta lại
thấy nhãn thời gian vector cung cấp cách đơn
giản và nhỏ gọn thể hiện lịch sử
sự kiện trong các tiến trình của hệ thống
phân tán.
CHƯƠNG 9:
BẢO
MẬT
Bảo mật không phải là
yếu tố quan trọng nhất nhưng có thể
thấy đó là một trong những vấn đề phức
tạp nhất vì nó bao trùm lên toàn bộ hệ thống,
một lỗ hổng trong thiết kế bảo mật có
thể làm cho tất cả các biện pháp bảo mật
trở nên vô dụng. Xây dựng tất cả các loại cơ
chế bảo mật áp dụng cho hệ thống sẽ
không có ý nghĩa gì nếu không biết cách sử dụng để
chống lại đối tượng nào, điều này
đỏi hỏi phải biết về chính sách bảo
mật phải được thực hiện.
Chương này sẽ giới thiệu những vấn
đề cơ bản về bảo mật, các chính sách
bảo mật, vấn đề thiết kế cơ
chế trợ giúp thực thi chính sách bảo mật, mã hóa
dữ liệu và cuối cùng sẽ giới thiệu
giải pháp tích hợp vào hệ
thống phân tán để hỗ trợ bảo mật.
Bảo mật trong hệ thống phân
tán có thể chia thành hai nhóm, nhóm thứ nhất liên quan
đến truyền thông giữa người sử
dụng với người sử dụng hoặc giữa
các tiến trình với nhau, nhóm thứ hai liên quan
đến vấn đề lưu trữ trên các máy tính
khác nhau. Nhóm thứ nhất liên quan tới các cơ chế căn
bản để đảm bảo bí mật truyền
thông là bí mật kênh truyền, trong khi nhóm thứ hai liên quan
tới các vấn đề về ủy quyền và
kiểm soát truy nhập. Bí mật kênh truyền và kiểm
soát truy nhập đòi hỏi các cơ chế phân phát các
khóa mã hóa và đồng thời cũng cần phải có
những cơ chế về việc quản lý
người sẻ dụng, những vấn đề này
sẽ được đề cập tới trong mục
quản lý bảo mật. Ngoài ra, cũng sẽ thảo luận
các vấn đề giải quyết liên quan tới
quản lý các khóa mã hóa, quản lý nhóm bảo mật và
xử lý chứng chỉ bảo mật.
Bảo mật trong
một hệ thống máy tính liên quan chặt chẽ
đến khái niệm về tính chất tin cậy, có
thể hiểu một hệ thống máy tính đáng tin
cậy là hệ thống mà người sử dụng hoàn
toàn tin tưởng vào các dịch vụ mà hệ thống
đó cung cấp. Tính chất tin cậy bao gồm khả
năng sẵn sàng, mức độ tin cậy, mức
độ an toàn và khả năng bảo trì. Khả năng
sẵn sàng liên quan tới công tác đảm bảo hệ
thống hoạt động liên tục, đáp ứng ngay
những yêu cầu sử dụng của người sử
dụng, điều này cũng liên quan tới vấn
đề dự phòng và khắc phục khi xảy ra sự
cố.
Tuy nhiên, nếu chúng ta
tin tưởng vào hệ thống máy tính thì cũng nên tính
đến tính bí mật và toàn vẹn thông tin, tính bí mật
ngụ ý thông tin chỉ được phép tiết lộ
cho những đối tượng có thẩm quyền. Tính
bí mật thể hiện sự bảo vệ dữ
liệu của hệ thống thông tin, chỉ những
người dùng hợp pháp mới được phép truy
cập thông tin và thông tin đó được trao đổi
theo các cơ chế đảm bảo an toàn, tránh truy nhập
của người dùng bất hợp pháp. Tính toàn vẹn
là đặc tính chỉ có thể thay đổi tài nguyên
hệ thống theo cách đã được ủy
quyền, đảm bảo dữ liệu không bị
sửa đổi hoặc phá hủy bởi người
dùng bất hợp pháp. Tài nguyên chính của hệ thống
máy tính bao gồm phần cứng, phần mềm và dữ
liệu, hệ thống phải có khả năng phát
hiện và phục hồi cho những tài nguyên này khi những
thay đổi không hợp lệ.
Một
cách nhìn khác về bảo mật trong các hệ thống máy
tính là chúng ta cố gắng bảo vệ các dịch vụ
và dữ liệu chống lại các mối đe dọa
về bảo mật. Hiểm họa đối với
thông tin bao gồm những vấn đề liên quan tới
điều kiện vật lý và các cuộc tấn công vào
hệ thống. Hiểm họa vật lý có thể kể
tới vấn đề nguồn điện, môi
trường…, các cuộc tấn công từ bên ngoài có
thể xuất hiện dưới dạng tấn công
thăm dò, truy nhập trái phép, tấn công từ chối
dịch vụ, tấn công bằng phần mềm chứa
mã độc… Pfleeger đã chỉ ra bốn loại
hiểm họa bảo mật gồm chặn thông
điệp, làm gián đoạn hệ thống, sửa
đổi nội dung và bịa đặt nội dung.
Khái
niệm chặn thông điệp đề cập
đến tính huống đối tượng không có
thẩm quyền đã giành được quyền truy
nhập vào dịch vụ hoặc dữ liệu, ví dụ
thông tin đã bị nghe trộm trên đường
truyền. Hiểm họa gián đoạn cũng xảy ra
khi dữ liệu bị sao chép trái phép, ví dụ sau khi
đột nhập vào thư mục cá nhân sẽ làm
hỏng hoặc xỏa các tập tin trong hệ thống,
như vậy hệ thống sẽ không còn có khả
năng cung cấp dịch vụ liên quan tới các tập
tin đó. Tổng quát hơn, hiểm họa gián
đoạn đề cập tới các tình huống
dịch vụ hoặc dữ liệu không thể sẵn
sàng, không thể sử dụng được hoặc
bị phá hủy hoản toàn, các cuộc tấn công từ
chối dịch vụ cố gắng làm cho người
sử dụng không thể tiếp cận được
với các dịch vụ cũng được xếp vào
loại này.
Khái
niệm sửa đổi bao gồm thay đổi trái phép
dữ liệu hoặc giả mạo dịch vụ
để nó không còn giữ được những
đặc điểm kỹ thuật ban đầu, ví
dụ chặn và sau đó thay đổi dữ liệu trên
đường truyền, giả mạo các thực
thể cơ sở dữ liệu và thay đổi
chương trình để bí mật ghi lại các hoạt
động của người sử dụng. Khái niệm
bịa đặt đề cập đến tình
huống tạo thêm dữ liệu hoặc hoạt động
bình thường không tồn tại, ví dụ kẻ
đột nhập có thể cố gắng thêm thông tin vào
tập tin mật khẩu hoặc cơ sở dữ
liệu, đột nhập vào hệ thống và gửi
lại các thông điệp do hệ thống đã gửi
trước đó. Lưu ý rằng các hình thức gián
đoạn, sửa đổi và bịa đặt
đều có thể được xem như những hình
thức giả mạo dữ liệu.
Chỉ
đơn giản nói rằng hệ thống nên có khả
năng tự chống lại tất cả các hiểm
họa bảo mật thì không phải là cách thực sự
xây dựng một hệ thống an toàn, trước
hết cần phải mô tả các yêu cầu bảo
mật hay còn gọi là các chính sách bảo mật. Chính sách
bảo mật mô tả chính xác các hành động nào các
thực thể trong hệ thống được phép
thực hiện và những hành động nào bị
cấm. Các thực thể bao gồm người sử
dụng, các dịnh vụ, dữ liệu, máy móc… Khi đã
thiết lập chính sách bảo mật thì có thể tập
trung vào những cơ chế bảo mật đẻ
đảm bảo thực thi chính sách. Các cơ chế
bảo mật quan trọng bao gồm mã hóa dữ liệu,
xác thực, ủy quyền và lưu vết.
Mã hóa là
nền tảng của bảo mật máy tính, nó chuyển
dữ liệu thành dạng để kẻ tấn không
không thể hiểu được, nghĩa là cung cấp
các phương tiện để thực hiện bí
mật dữ liệu. Hơn nữa, mã hóa còn cho phép chúng ta
kiểm tra xem dữ liệu có bị sửa đổi hay
không, như vậy nó cũng có thể hỗ trợ
kiểm tra tính toàn vẹn. Xác thực dùng để
kiểm tra tính chính danh của đối tượng tham
gia, đối tượng có thể là người sử
dụng hoặc máy tính và các thực thể khác, như
vậy việc xác thực sẽ loại bỏ
được những đối tượng giả
mạo. Thông thường, người sử dụng
được xác thực bằng mật khẩu, các
thiết bị có thể được xác thực
bằng địa chỉ logic hoặc địa chỉ
vật lý và cũng có thể được xác thực
bằng mật khẩu.
Sau khi
đã xác thực, cần thiết phải kiểm tra xem
đối tượng có được ủy quyền
thực hiện các hành động đã yêu cầu hay không,
thực chất đó là những qui định về phân
quyền thực hiện. Các công cụ lưu vết ghi
lại những đối tượng nào đã truy
nhập và truy nhập bằng cách nào, mặc dù nó không
bảo vệ chống lại các hiểm họa bảo
mật nhưng nhật ký lưu vết có thể
đặc biệt hữu ích cho việc phân tích lỗ
hổng bảo mật và tìm ra các biện pháp chống
lại kẻ tấn công. Vì lý do này kẻ tấn công mói
chung rất ranh ma không để lại dấu vết nào
để có thể dẫn đến lộ danh tính
của mình, trong trường hợp này ghi nhật ký truy
nhập đôi khi sẽ làm cho cuộc tấn công mạo
hiểm hơn. Các điểm yếu của hệ
thống phân tán nằm ở kỹ thuật truyền thông
và chính sách bảo mật thông tin. Điểm yếu về
kỹ thuật truyền tin trên mạng có nguyên nhân từ đặc
tính mở của các giao
thức như HTTP, FTP, ICMP, SMNP, SMTP…. Điểm yếu
về chính sách bảo mật hệ thống thông tin
thể hiện ở việc không xây dựng chính sách
khắc phục khi tấn công xảy ra và cũng không có qui
trình giám sát và kiểm tra các hoạt động trong hệ
thống thông tin.
Kẻ truy nhập trái
phép sử dụng hình thức tấn công này để khám
phá hệ thống thông tin, ví dụ thông tin về hình
trạng mạng, hệ điều hành, các dịch vụ
sử dụng và các điểm yếu có thể lợi
dụng để tấn công nhằm mục đích cuối
cùng là lấy cắp dữ liệu, bắt đầu cho
một cuộc tấn công nguy hiểm hoặc tấn công
từ chối dịch vụ. Tấn công thăm dò
thường được thực hiện theo các
bước sau:
1.
Ping đến địa chỉ đích
xem địa chỉ IP đó có hoạt động không.
2.
Quét cổng để xác định
cổng hay dịch vụ nào đang hoạt động
trên địa chỉ IP đó.
3.
Truy vấn đến các cổng, từ
đó có thể xác định kiểu và phiên bản
của ứng dụng, hệ điều hành.
4.
Từ các bước trên suy ra các
điểm yếu có thể lợi dụng để
tấn công.
Để truy nhập
được vào hệ thống thông tin phải có tài
khoản đang nhập, việc lộ bí mật tài
khoản dưới bất
cứ hình thức nào cũng có thể gây nên tổn hại
làm mất mát thông tin. Đối tượng truy nhập
trái phép trước hết phải đánh cắp thông tin
tài khoản, công việc này có thể được
thực hiện bằng các hình thức sau:
1.
Thăm dò mật khẩu: nhằm mục
đích lấy cắp thông tin đăng nhập của
người dùng bao gồm tên đăng nhập và mật
khẩu, có thể sử dụng phương pháp dự
đoán mật khẩu theo ký tự từ điển,
đoán mật khẩu
2.
Đóng vai trung gian: Sử dụng các công
cụ và phần mềm bắt gói tin, phân tích sửa
đổi và là người trung gian chuyển dữ
liệu cho máy trạm và máy chủ.
3.
Sử dụng tính năng tin cậy có
sẵn trong một số hệ thống truyền tin:
Một số thiết bị và máy tính có cài đặt
sẵn tính năng này nhằm nâng cao hiệu suất
hoạt động.
Kẻ tấn công vô
hiệu hóa hoặc phá hỏng hệ thống thông tin, làm
chậm hệ thống và các dịch vụ ứng dụng
với mục đích từ chối yêu cầu sử
dụng dịch vụ cho những người dùng hợp
pháp. Hình thức tấn công này dựa trên nguyên lý hoạt
động của giao thức TCP phải thiết lập
liên kết trước khi truyền số liệu, như
vậy máy chủ sẽ luôn phải tiếp nhận các yêu
cầu liên kết từ địa chỉ của kẻ
tấn công.
Phần mềm
độc hại (Worms, Virus, Trojan Horses) là các chương
trình chứa mã độc được chèn vào máy tính
để phá hủy hệ thống, tự nhân bản và
phát tán, từ chối dịch vụ hoặc truy cập
tới mạng, hệ thống và các dịch vụ. Virus
xâm nhập vào máy tính theo khi sao chép tập tin từ ổ
đĩa trên máy tính, thông qua thư điện tử.... Các
dấu hiệu khi hệ thống bị nhiễm virus:
-
Chương trình khởi động
chậm hơn, điều này là do virus đang phát tán
tới các tập tin khác trên hệ thống hoặc đang
chiếm tài nguyên.
-
Xuất hiện các tập tin lạ trên
ổ cứng hoặc mất tập tin, một số virus
xóa các tập tin quan trọng của hệ thống.
-
Kích thước chương trình thay
đổi so với phiên bản cài đặt ban
đầu, điều này xảy ra vì virus gắn chính nó
vào chương trình.
-
Trình duyệt, chương trình xử lý
văn bản, màn hình, thực đơn và cách ứng
dụng khác bị thay đổi.
-
Hệ thống bị tắt hoặc
khởi động một cách bất thường.
-
Mất quyền truy cập đến
ổ cứng hoặc các tài nguyên hệ thống khác, virus
có thể thay đổi các thiết lập trên thiết
bị làm cho nó không hoạt động chính xác.
-
Hệ thống không khởi động
hoặc đưa ra các thông báo lỗi trong suốt quá trình
khởi động.
Trojan horse không tự nhân bản, khi xâm nhập vào máy tính
chúng thường tạo ra một lỗ hổng bảo
mật gọi là cửa sau, kẻ đột nhập có
thể thông qua cửa sau để xâm nhập và nắm
quyền kiểm soát máy tính. Worm là một dạng mã
độc có khả năng tự nhân bản, lây lan và không
cần vật chủ, chúng có kích thước lớn
hơn virus và thường núp dưới dạng một tập
tin đính kèm thư điện tử. Worms không phải là
virus nhưng hay được sử dụng như
một công cụ để chứa và phát tán virus, khi máy
tính bị nhiễm Worms nó sẽ nhanh chóng chiếm bộ
nhớ và tự nhân bản.
Hệ thống phân tán
phải cung cấp các dịch vụ bảo mật
để có thể cài đặt các chính sách bảo
mật, nhiều vấn đề thiết kế quan
trọng cần phải lưu ý khi cài đặt các
dịch vụ bảo mật đa năng. Phần này
sẽ giới thiệu những vấn đề cơ
bản trong thiết kế bảo mật, đó là xác
định trọng tâm kiểm soát, phân tầng cơ
chế bảo mật, phân bố cơ chế bảo
mật và tính đơn giản của cơ chế
bảo mật.
Khi xem xét bảo
vệ hệ thống phân tán, về cơ bản có ba cách
tiếp cận khác nhau: bảo vệ dữ liệu, phân
quyền thao tác và phân quyền cho người sử
dụng. Cách tiếp cận thứ nhất tập trung vào
việc bảo vệ trực tiếp dữ liệu, không
quan tâm tới thao tác thực hiện mà mục đích chính
là đảm bảo tính toàn vẹn dữ liệu. Ví
dụ các ràng buộc trong các hệ quản trị cơ sở
dữ liệu tự động kiểm tra sư thay
đổi của mục dữ liệu, có thể
đặt thuộc tính hoặc sử dụng đặc
tính tự nhiên của giao tác để ngăn ngừa thay
đổi cho những mục dữ liệu chỉ
được phép đọc.
Cách tiếp cận
thứ hai tập trung vào các thao tác, xác định
đối tượng được phép gọi thao tác và
thậm chí xác định thời gian được phép
truy nhập tài nguyên, trọng tâm kiểm soát liên quan
mạnh mẽ với các cơ chế kiểm soát truy
nhập. Cách tiếp cận thứ ba tập trung trực
tiếp vào người sử dụng bằng cách tạo
ra các phương tiện và phân quyền cho họ
để có thể truy nhập vào hệ thống. Như
vậy vấn đề kiểm soát sẽ tập trung vào
việc định nghĩa các vai trò của người
sử dụng, hệ thống cần phải
được thiết kế sao cho có thể định
nghĩa các quyền, cung cấp cơ chế hỗ trợ
kiểm soát truy nhập dựa trên việc phân quyền.
|

|

|
|
(a)
Bảo vệ chống các thao tác sai
|
(b) Bảo vệ
chống thao tác chưa được cấp quyền
|
|

|
|
(c)
Bảo vệ chống lại truy nhập chưa
được ủy quyền
|
Hình 9.1 Các cách tiếp cận bảo
mật
Một điểm quan trọng trong
thiết kế các hệ thống an toàn là quyết
định các cơ chế bảo mật nên đặt
ở tầng nào, khái niệm tầng ở đây
được mạnh dạn sử dụng vì tất
cả các hệ thống phân tán đều được
xây dựng trên nền tảng mạng máy tính và các mạng
máy tính đều được tổ chức phân
tầng theo mô hình tham chiếu.

Hình 9.2 Tổ chức phân tầng logic
hệ thống phân tán
Hình 9.2 thể hiện mô hình phân tầng
của hệ thống phân tán, thông thường gồm
tầng ứng dụng, tầng phần mềm trung gian,
tầng dịch vụ hệ điều hành và tầng lõi
của hệ điều hành. Việc tách biệt các
dịch vụ đa dụng với các dịch vụ
truyền thông để hiểu về cơ chế phân
tầng bảo mật trong các hệ thống phân tán.
Bảo mật là câu chuyện của kỹ thuật còn tin
tưởng lại là cảm xúc, cơ chế bảo
mật sẽ được đặt ở tầng nào
phụ thuộc vào việc các dịch vụ sẽ
được bảo mật như thế nào trong các
tầng cụ thể để máy khách có thể tin
tưởng. Ví dụ, xem xét tổ chức được
đặt tại các địa điểm khác nhau và chúng
được nối với nhau qua dịch vụ
chuyển mạch tốc độ cao SMDS, mạng SMDS có
thể coi như xương sống nối các mạng
cục bộ phân tán về
mặt địa lý. Có thể thực hiện bảo
mật bằng cách đặt thiết bị mã hóa tại
mỗi thiết bị định tuyến của SMDS,
những thiết bị này tự động mã hóa và
giải mã các gói tin được gửi giữa các
đia điểm nhưng không bảo vệ truyền thông
giữa các máy cùng địa điểm. Người
sử dụng thuộc các địa điểm khác nhau
gửi thông điệp cho nhau, họ đều lo sợ
thông điệp sẽ bị lộ khi gửi trên
đường truyền, nhưng ít nhất họ
phải tin tưởng rằng thông điệp đều
sẽ được mã hóa khi ra khỏi mạng cục
bộ, như vậy hệ thống phân tán đã cung cấp
các biện pháp chống lại việc giả mạo
thiết bị.

Hình 9.3 Bảo mật liên mạng
Giả sử người sử
dụng không tin tưởng vào bảo mật liên mạng,
họ có thể sử dụng các dịch vụ bảo
mật của tầng vận tải như SSL (Secure Sockets Layer),
các đoạn tin của tầng vận tải vẫn
được mã hóa trên thiết bị mã hóa của
mạng SMDS nhưng trong trường hợp này
người sử dụng đặt niềm tin vào SSL.
Trong các hệ thống phân tán, các cơ chế bảo
mật thường đặt tại tầng phần
mềm trung gian, nếu người sử dụng không tin
tưởng SSL thì vẫn có thể sử dụng dịch
vụ gọi thủ tục từ xa an toàn, người
sử dụng một lần nữa lại tin
tưởng vào dịch vụ gọi thủ tục từ
xa an toàn như đã hứa hẹn, như thế sẽ
không bị rò rỉ thông tin hoặc xác thực chính xác máy
khách và máy chủ. Các dịch vụ bảo mật
đặt ở tầng phần mềm trung gian của
hệ thống phân tán chỉ có thể đáng tin cậy
nếu chúng dựa trên các dịch vụ thực sự an
toàn. Ví dụ, dịch vụ gọi thủ tục từ
xa an toàn được cài đặt bằng SSL thì sự
tin cậy của thủ tục gọi từ xa hoàn toàn
phụ thuộc vào mức độ tin cậy SSL, nếu
SSL không đáng tin cậy thì cũng không tin cậy dịch
vụ gọi thủ tục từ xa.
Sự phụ thuộc giữa các dịch
vụ đối với sự tin cậy dẫn
đến khái niệm cơ sở tính toán tin cậy,
đó là tập tất cả các cơ chế bảo
mật trong hệ thống phân tán cần thiết
để đảm bảo chính sách bảo mật, như
vậy nó phải được tin cậy, cơ sở
tính toán tin cậy càng nhỏ càng tốt. Nếu hệ
thống phân tán được xây dựng như phần
mềm trung gian trên hệ điều hành thì tính bảo
mật của nó có thể phụ thuộc vào tính bảo mật
của các hệ điều hành cục bộ đang
sử dụng, nghĩa là cơ sở tính toán tin cậy
trong hệ thống phân tán có thể bao gồm cả các hệ
điều hành cục bộ trên các máy khác nhau. Ví dụ các
máy chủ tập tin trong hệ thống tập tin phân tán
có thể phải dựa vào các cơ chế bảo vệ
khác nhau do hệ điều hành cục bộ cung cấp,
những cơ chế này không chỉ gồm việc
bảo vệ các tập tin chống lại sự truy nhập
của các tiến trình khác ngoài máy chủ tập tin mà còn
các cơ chế bảo vệ máy chủ tập tin tránh
được tấn công mạng.
Các hệ thống phân tán dựa trên phần
mềm trung gian như vậy đòi hỏi tin tưởng
vào các hệ điều hành cục bộ mà chúng phụ thuộc,
nếu không tin tưởng thì một phần chức
năng của hệ điều hành cục bộ có
thể sẽ phải được tích hợp vào hệ
thống phân tán. Hầu hết các dịch vụ của
hệ điều hành đều chạy như những
tiến trình của người sử dụng, trong
trường hợp này hệ thống tập tin có thể
phải thay thế hoàn toàn để đáp ứng các nhu
cầu riêng của hệ thống phân tán, bao gồm cả
các biện pháp bảo mật. Cách tiếp cận phù
hợp sẽ là tách riêng các dịch vụ bảo mật
với các loại dịch vụ khác bằng cách phân tán các
dịch vụ trên các máy khác nhau tùy theo yêu cầu bảo
mật. Ví dụ để bảo mật hệ thống
tập tin phân tán có thể cách ly máy chủ tập tin
với các máy khách bằng cách đặt máy chủ trên máy
với hệ điều hành tin cậy, có thể chạy
hệ thống tập tin an toàn chuyên dụng, các máy khách
đặt trên các máy không tin cậy.

Hình 9.4 Nguyên lý RISSC
áp dụng cho hệ thống phân tán
Việc tách riêng này làm giảm đáng kể
cơ sở tính toán tin cậy xuống còn một
lượng nhỏ các máy và các thành phần phần mềm,
kết quả là bảo vệ các máy này tránh
được những tấn công bảo mật từ
bên ngoài, sự tin cậy tổng thể trong bảo
mật hệ thống phân tán có thể sẽ tăng lên. Neumann đã đưa ra cách tiếp
cận RISSC (Reduced Interfaces for Secure
System Components) để ngăn chặn các máy khách các
ứng dụng trực
tiếp truy nhập vào các dịch vụ quan trọng,
bất kỳ máy chủ bảo mật quan trọng nào
đều được đặt trên máy riêng biệt
cách ly với các hệ thống đầu cuối người
sử dụng và sử dụng các giao diện mạng an
toàn mức thấp, máy khách và các ứng dụng của
họ có thể truy nhập đến máy chủ bảo
mật thông qua các giao diện mạng này.
Quyết định tầng nào sẽ
đặt các cơ chế bảo mật phải
đảm bảo tính đơn giản, nói chung việc
thiết kế an toàn cho hệ thống máy tính là nhiệm
vụ khó khăn, thiết kế sao cho cơ chế
vận hành đơn giản và dễ hiểu nhưng
vẫn phải đảm bảo tính tin cậy. Rất
tiếc những cơ chế đơn giản không
phải lúc nào cũng đủ để thực thi chính
sách bảo mật, ví dụ về trường hợp
kết nối liên mạng trên hình 9.3, mã hóa tầng liên
kết là cơ chế đơn giản và dễ hiểu
để bảo vệ chống lại nguy cơ đánh
cắp khi trao đổi thông tin liên mạng, tuy nhiên
người sử dụng lại muốn đảm
bảo chính xác đối tượng gửi thông
điệp cho mình. Trong trường hợp này cần
đến các dịch vụ và xác thực mức
người sử dụng, họ có thể muốn
biết các dịch vụ đó làm việc như thế
nào để đặt niềm tin vào những dịch
vụ đó. Do đó, xác thực người dùng có thể
yêu cầu ít nhất khái niệm về các khoá bí mật và hiểu
biết về chứng chỉ, mặc dù nhiều dịch
vụ bảo mật được tự động hóa
ở mức cao và hoàn toàn trong suốt đối với
người sử dụng.
Trong các trường hợp khác, bản thân
ứng dụng vốn đã phức tạp và việc
giới thiệu bảo mật chỉ làm cho vấn
đề tồi tệ hơn. Ví dụ điển hình liên
quan đến các giao thức bảo mật phức
tạp là các hệ thống thanh khoản, sự phức
tạp của giao thức thanh khoản thường do
nhiều bên liên quan tham gia. Trong những trường
hợp này, điều quan trọng là các cơ chế nền
tảng được sử dụng để cài
đặt các giao thức phải tương đối
đơn giản và dễ hiểu. Tính đơn giản
sẽ góp phần tạo ra sự tin cậy mà người
sử dụng đầu cuối sẽ đưa vào
ứng dụng và quan trọng hơn sẽ góp phần
thuyết phục các nhà thiết kế rằng hệ
thống không có lỗ hổng bảo mật.
Nền tảng cho bảo
mật trong các hệ thống phân tán là sử dụng các
kỹ thuật mã hóa, đó là các giải pháp khác nhằm bảo
vệ thông tin khi lưu chuyển trên mạng cũng như
truy nhập vào kho dữ liệu. Tư
tưởng cơ bản trong việc mã hóa thông tin là che
giấu nội dung dữ liệu đối với
những đối tượng không có thẩm quyền, vì
vậy bên gửi sẽ mã hóa dữ liệu trước
khi gửi, bên nhận sẽ giải mã dữ liệu
nhận được để phục hồi lại nội dung ban đầu. Tuy
nhiên, việc mã hóa thông tin sẽ làm tăng công việc
xử lý, điều đó làm ảnh hưởng
đến hiệu suất hoạt động của
hệ thống. Do đó, việc mã hóa thông tin cần
phải thực hiện cho từng loại thông tin nhằm
đảm bảo tính sẵn sàng phục vụ của
hệ thống phân tán, cần phải biết cân
đối hài hòa giữa mục tiêu bảo mật và
khả năng đáp ứng yêu cầu dịch vụ
của hệ thống.

Hình 9.5 Xâm nhập
và nghe trộm trong truyền thông
Mã hóa và giải mã kết
hợp với nhau bằng cách sử dụng các
phương thức mã hóa khóa bí mật, dạng ban
đầu của thông điệp gọi là bản rõ và
dạng đã được mã hóa gọi là bản mã. Gọi bản tin rõ là P, khóa mã hóa là K, thông
điệp được mã hóa theo
khóa EK là C=EK(P), thông điệp được giải mã theo khóa giải
mã P=DK(C). Hình 9.5 minh họa ba dạng tấn công
trên đường truyền, kỹ thuật mã hóa sẽ trợ giúp để
chống lại những dạng tấn công này. Loại
thứ nhất, kẻ đột nhập có thể
chặn thông điệp mà bên gửi và bên nhận
đều không biết đang bị nghe trộm, do
bản tin đã được mã hóa nên khó có thể
giải mã nếu không biết chính xác khóa bí mật, vì
vậy việc chặn bản tin trở nên vô nghĩa,
kẻ đột nhập không thể đọc được
nội dung bản tin. Tuy nhiên cũng cần phải lưu
ý, đôi khi chỉ cần một thông điệp kẻ tấn công cũng đủ
để đưa ra nhận định nào đó, ví
dụ lượng thông tin gửi đến một
địa điểm đã qui định giảm đáng
kể so với thông thường, trong khi lượng tương ứng lại tăng
lên đáng kể chuyển đến một địa
điểm khác.
Loại
tấn công thứ hai là sửa đổi thông điệp,
sửa đổi thông điệp bản rõ rất dễ
nhưng sửa thông điệp bản mã một cách chính
xác sẽ phức tạp hơn rất nhiều,
đầu tiên kẻ đột nhập phải giải mã
được thông điệp trước khi thực hiện sửa
đổi, sau đó lại phải mã hóa chính xác, nếu
không bên nhận có thể được cảnh báo thông
điệp đã bị giả mạo. Loại tấn công
thứ ba, kẻ đột nhập thêm các bản tin mã hóa
vào hệ thống truyền thông để bên nhận B tin
rằng đó là thông điệp xuất phát từ bên
gửi A, kẻ đột nhập đã thay đổi
được nội dung thông điệp thì việc thêm
một thông điệp giả mạo là chuyện bình
thường, để thực hiện điều này
tất nhiên kẻ tấn công phải biết
được khóa bí mật trao đổi giữa bên
gửi A và bên nhận B. Về cơ bản, dựa trên
khóa mã hóa và khóa giải mã, có hai loại hệ thống mã
hóa khác nhau, mã hóa đối xứng sử dụng khóa bí
mật chung cho cả bên gửi lẫn bên nhận, trong mã
hóa bất đối xứng khóa mã hóa bên gửi khác
với khóa giải mã bên nhận.
Mã hóa
đối xứng dùng khóa bí mật, khóa mã hóa và khóa
giải mã giống nhau, bên nhận và bên gửi đều
phải có khóa trên và khóa phải được giữ bí
mật nên phương pháp này còn gọi là mã hóa bí mật
hoặc mã hóa chia sẻ. Sử dụng ký pháp KA,B
ngụ ý khóa K được chia sẻ giữa A và B, ta có:
P=DKA,B(EKA,B(P))
Mã hóa bất
đối xứng dùng khóa công khai, khóa mã hóa và khóa giải
mã khác nhau nhưng chúng tạo thành một cặp duy
nhất giữa bên gửi và bên nhận, một khóa sẽ
được giữ bí mật còn một khóa sẽ
được công khai nên phương pháp này còn gọi là
mã hóa công khai. Ký hiệu KE là khóa mã hóa và KD
là khóa giải mã, ta có:
P=DKD(EKE(P))
Khóa nào
được giữ bí mật sẽ tùy thuộc vào
việc sử dụng khóa, ví dụ nếu A muốn
gửi thông điệp bí mật cho B thì A sẽ sử
dụng mã khóa công khai do B cung cấp, B nắm giữ khóa bí
mật riêng nên chỉ có B mới có thể giải mã
được thông điệp. Ngược lại
nếu B muốn đảm bảo chắc chắn thông
điệp đến từ A thì A phải sử dụng
khóa bí mật riêng của mình để mã hóa thông
điệp, B sử dụng khóa công khai của A để
giải mã, nếu giải mã thành công thì chắc chắn
thông điệp là của A.
Ứng
dụng cuối cùng của mã hóa trong hệ thống phân tán
là việc sử dụng các hàm băm, đầu vào
của hàm băm là thông điệp m có độ dài tùy ý
nhưng đầu ra là chuỗi các bit có độ dài
cố định h=H(m). Hàm băm là hàm một chiều,
việc tính toán hàm băm đơn giản nhưng không
thể tìm thấy thông điệp m tương ứng
với giá trị trả về của hàm băm. Nếu
hai thông điệp khác nhau thì hàm băm sẽ trả
về những giá trị khác nhau, ngược lại không
thể tìm thấy hai thông điệp khác nhau mà có cùng giá
trị trả về của hàm băm. Các đặc tính
trên đã được áp dụng cho việc sản sinh
cặp khóa bí mật và khóa công khai.
Giải thuật mã hóa DES (Data Encryption Standard)
dùng cho các hệ thống mã hóa đối xứng, giải thuật thực
hiện trên các khối dữ liệu 64 bit, mỗi khối
được mã hóa qua 16 vòng lặp, mỗi vòng có một
khóa mã hóa 48 bit riêng, 16 khóa này được sinh ra từ 56
bit khóa chính. Đầu vào của vòng lặp mã hóa thứ i
là dữ liệu đã được mã hóa của vòng
lặp thứ i-1, 64 bit dữ liệu qua mỗi vòng
lặp được chia thành hai phần bằng nhau Li-1
và Ri-1, cùng bằng 32 bit. Phần dữ
liệu bên phải Ri-1 được lấy làm
phần bên trái của dữ liệu cho vòng sau: Ri-1=
Li. Hàm f với đầu vào là Ri-1 và khóa Ki
sinh ra khối 32 bit được XOR với Li-1 để sinh ra Ri.
Mỗi khóa 48 bit cho mỗi vòng lặp được sinh ra
từ khóa chính 56 bit như sau: hoán vị khóa chính, chia
đôi thành hai phần 28 bit. Tại mỗi vòng, mỗi
một nửa đó sẽ quay trái một hoặc hai bit,
sau đó lấy ra 24 bit kết hợp với 24 bit của
nửa còn lại tạo ra khóa.

Hình 9.6 Vòng lặp sản sinh khóa trong DES
Nguyên lý của DES hoàn toàn
đơn giản nhưng rất khó bẻ khóa nếu
sử dụng các phương pháp phân tích, lý do vì sao vẫn
chưa được giải thích công khai. Sử dụng
tấn công thăm dò bằng cách tìm kiếm khóa sẽ làm
cho công việc bẻ khóa trở nên dễ dàng hơn, vì
vậy Triple DES cải tiến giải
thuật bằng cách sử dụng DES ba lần với các
khóa khác nhau sẽ làm tăng độ an toàn lên rất
nhiều. Giải thuật DES đã được sử
dụng làm kỹ thuật mã hóa chuẩn trong nhiều
năm, tuy nhiên gần đây đang được thay
thế bằng giải thuật Rijndael
với khối 128 bit hoặc lớn hơn. Giải
thuật Rijndael được thiết kế để
chạy nhanh hơn và như vậy có thể
được sử dụng trong các thẻ thông minh.
Giải thuật RAS (viết
tắt tên của ba nhà phát minh Rivest, Shamir và Adleman) được
sử dụng rộng rãi trong các hệ thống khóa công
khai, tính bảo mật của giao thức xuất phát
từ thực tế chưa có phương pháp nào hiệu
quả để tìm ra số nguyên tố rất lớn.
Như chúng ta đã biết, mỗi số nguyên dương
đều có thể viết dưới dạng tích
của các số nguyên tố, trong RSA các khóa riêng và khóa công
khai được tạo ra từ các số nguyên tố
rất lớn với hàng trăm chữ số, việc
bẻ khóa sẽ phải tốn rất nhiều thời
gian. Cách sinh khóa của giả thuật RAS thực hiện
theo bốn bước:
1.
Chọn
2 số nguyên tố lớn khác nhau p và q
2.
Tính n = p.q và z = (p-1).(q-1)
3.
Chọn một số tự
nhiên d sao cho 1<d<z và nguyên tố cùng nhau với z
4.
Tính toán e sao cho e.d =1 mod z,
nghĩa là tìm số tự nhiên x sao cho e=(x.z+1)/d cũng là
số tự nhiên.
Như vậy d và e tạo thành
một cặp duy nhất, nếu dùng d để giải
mã thì e sẽ dùng để mã hóa, có thể công khai một
trong hai số này. Giải thuật RAS coi thông điệp
được truyền đi là một dãy các số
nhị phân, chia thông điệp m thành các khối có kích
thước cố định mi sao cho 0 ≤ mi
≤ n. Ở bên gửi, mỗi khối mi sẽ
tính giá trị ci = mie(mod n) rồi
gửi đi. Bên nhận sẽ giải mã bằng cách tính mi
= cid(mod n), như vậy để mã hóa
cần biết e và n còn để giải mã thì cần
biết d và n. So với giải thuật mã hóa đối
xứng, giải thuật RSA tính toán phức tạp hơn
do đó thời gian thực hiện sẽ gấp hàng
trăm lần. Vì vậy giải thuật RSA chỉ nên áp
dụng để trao đổi các khóa bí mật chứ
không dùng cho việc mã hóa các dữ liệu thông
thường.
Hàm băm MD5
(Message-Digest 5) được sử dụng rộng rãi
trong các giải thuật mã hóa, nó tính toán xâu ký tự nhị
phân bất kỳ để cho về giá trị băm 128
bit và thường thể hiện dưới dạng
chữ số hệ hexa. Dữ liệu đầu vào
trước hết được thêm vào sao cho số
dư của chiều dài sau khi thêm là 448 bits, sau đó thêm 64 bit thể hiện chiều dài
của dữ liệu ban đầu, như vậy toàn
bộ dữ liệu sẽ được chia thành các đoạn 512 bit.
Giải thuật MD5 bắt đầu bằng hằng
số 128 bit và thực hiện trong k pha, trong đó k là
số lượng khối 512 bit, trong mỗi pha chữ
số 128 bit được tính từ khối 512 bit
của dữ liệu đầu vào và 128 bit của pha
trước.

Hình 9.7 Cấu
trúc của MD5

Hình 9.8 Thao tác lặp trong vòng đầu
của pha MD5
Mỗi
pha trong MD5 gồm 4 vòng tính toán, mỗi vòng sử dụng
một trong bốn hàm, mỗi hàm thao tác với các biến
số 32 bit x, y và z:
F(x.y.z) = (x AND y) OR (NOT x) AND z)
G(r.y.z) = (x AND z) OR (y AND (NOT z)
H(x.y.z) =x XOR y
XOR z
I (z.y.z) =y XOR (x OR (NOT z))
Ví dụ, khối b được chia thành 16
khối con dài 32 bit ký hiệu b0 đến b15,
mỗi khối con sẽ ký hiệu là (p.q.r.s). Tại vòng
thứ nhất, hàm f dùng để thay đổi bốn
biến số (p.q.r.s) trong 16
thao tác lặp như trên hình 9.8, có tổng cộng 64
hằng số định nghĩa trước Ci,
ký hiệu x<<<n nghĩa là quay sang trái, các bit của
biến x sẽ được dịch sang bên trái n vị
trí, bit bên trái nhất sẽ chuyển về vị trí
của bit bên phải nhất. Các biến này
được thực hiện cho mỗi vòng tiếp theo
và sau khi một pha kết thúc được chuyển sang pha
kế tiếp. Vòng thứ hai sử dụng hàm G theo cách
tương tự, hàm H sử dụng cho vòng thứ 3 và I
sử sụng cho vòng thứ 4, cứ lặp lại như
vậy cho đến khi hoàn thành. Như vậy mỗi vòng
sẽ gồm 64 thao tác lặp lại sau đó lại
bắt đầu pha mới với các giá trị (p.q.r.s)
ở tại điểm này.
Mô hình khách chủ thường
được sử dụng để xây dựng hệ
thống phân tán, máy chủ cũng có thể đóng vai trò
máy khách đối với các máy chủ khác. Bảo mật
cho hệ thống phân tán phải bảo đảm thông tin
được an toàn trên các máy chủ và trên
đường truyền mạng. Bảo mật dữ
liệu trên mỗi máy chủ liên quan tới vấn
đề kiểm soát quyền truy nhập, bảo mật
truyền thông đòi hỏi xác thực các bên tham gia. Trong
nhiều trường hợp bảo mật truyền thông yêu
cầu tính toàn vẹn và bí mật dữ liệu,
đặc biệt truyền thông nội bộ giữa các
máy chủ. Vấn đề bảo mật truyền thông
có thể thực hiện bằng cách thiết lập kênh
bảo mật giữa các bên tham gia, nó sẽ bảo vệ
chống lại các hiểm họa bảo mật. Chống
lại hiểm họa chặn thông điệp bằng các
phương tiện mã hóa, chống lại hiểm họa
sửa đổi và bịa đặt bằng cách sử
dụng các giao thức xác thực lẫn nhau, phần
tiếp theo sẽ đề cập tới cách sử
dụng các giao thức này.
Xác thực và đảm bảo toàn vẹn
dữ liệu luôn phải đi kèm với nhau, một
hệ thống đảm bảo tính xác thực nhưng
không đảm bảo toàn vẹn thì cũng không có ý
nghĩa trong bảo mật dữ liệu, thông điệp
hoàn toàn có thể bị sửa đổi khi di chuyển
trên đường truyền. Tương tự như
vậy một hệ thống bảo đảm tính toàn
vẹn nhưng không bảo
đảm tính xác thực thì cũng không có ý nghĩa,
kẻ tấn công hoàn toàn có thể giả mạo bên
gửi hoặc bên nhận. Trong nhiều giao thức hai công
việc này được cài đặt bằng cách
thực hiện xác thực khi thiết lập kênh liên
kết các bên tham gia, sau đó bảo đảm tính toàn
vẹn dữ liệu bằng cách sử dụng mã hóa khóa
bí mật cho mỗi phiên giao dịch, khóa bí mật của
mỗi phiên sẽ bị hủy bỏ khi kết thúc kênh
liên kết.
Xác thực dựa trên khóa bí mật giả
thiết tất cả các bên tham gia hai đều phải
biết khóa bí mật, làm thế nào để trao
đổi khóa này sẽ đề cập trong các phần
sau. Giao thức được thực hiện theo cách thông
thường, các bên tham gia sẽ không nghi ngờ nhau
nếu các bên đều biết khóa bí mật. Hình 9.9 minh
họa trao đổi thông tin giữa A và B để
thực hiện xác thực dựa trên khóa bí mật, cả
A và B đều phải biết khóa bí mật KA,B.
Đầu tiên, A gửi cho B định danh của mình
để yêu cầu thiết lập kênh truyền, B sẽ
gửi lại A một số ngẫu nhiên RB, A
sử dụng khóa bí mật KA,B để trả
về cho B giá trị đã mã hóa EKA,B(RB). Nhận
được giá trị từ A, B sẽ giải mã DKA,B(EKA,B(RB)),
nếu kết quả trùng khớp với RB thì B có thể tin cậy
đối tượng đang thiết lập liên kết
chính xác là A. Tuy nhiên A vẫn chưa biết đối
tượng đang thiết lập liên kết có chính xác là
B hay không, vì vậy A sẽ gửi tiếp một số
ngẫu nhiên RA cho B, B trả về giá trị mã hóa
EKA,B(RA),
nhận được giá trị này A sẽ giải mã DKA,B(EKA,B(RA)),
nếu kết quả trùng khớp với RA thì A có thể tin cậy
đối tượng đang thiết lập liên kết
chính xác là B. Qui trình thực hiện như trên đòi
hỏi phải trao đổi năm thông điệp, phiên
bản rút gọn thể gộp thông điệp thứ
tư vào thông điệp thứ nhất và thông điệp
thứ năm vào thông điệp thứ hai, như vậy
sẽ chỉ còn trao đổi ba thông điệp và sẽ
tiết kiệm thời gian xác thực giữa các bên tham
gia

Hình 9.9 Xác thực dựa trên khóa bí
mật thực hiện 5 bước

Hình 9.10 Xác thực dựa trên khóa bí
mật thực hiện 3 bước
Rất tiếc giao thức rút gọn này
rất dễ bị tấn công phản xạ, giả
sử C muốn mạo danh A để xác thực với B
mà không cần biết khóa bí mật KA,B. Quá trình
giả mạo tiến hành bằng cách C thiết lập
phiên làm việc thứ nhất để gửi cho B thông điệp
chứa định danh của A và số ngấu nhiên RC,
B sẽ trả về RB, EKA,B(RC), tuy
nhiên C không biết khóa bí mật nên nó thiết lập
một phiên khác và gửi cho A
thông điệp C, RB, A sẽ mã hóa EKA,B(RB) và
gửi cho C, tất nhiên C sẽ lấy giá trị này và
trở về phiên làm việc thứ nhất để
gửi cho B, như vậy B tin rằng C chính là A. Nói chung
cho phép các bên tham gia thiết lập kênh an toàn thực
hiện một số công việc như nhau không phải là
ý tưởng tốt.

Hình 9.11 Tấn công phản xạ
Trong ví dụ trên, B đã vi
phạm qui tắc an toàn khi cung cấp thông tin hữu ích RB, EKA,B(RC) trong khi chưa biết C là
ai, nhưng điều này lại không bi phạm qui tắc
của giao thức rút gọn. Bài học ở đây là
vấn đề thiết kế các giao thức bảo
mật thực tế khó khăn hơn rất nhiều so
với những hình dung ban đầu, việc tinh chỉnh
giao thức để tăng hiệu năng có thể
ảnh hưởng tới tính chính xác của giao thức
như đã minh chứng trên.
Xác thực dựa trên khóa bí mật sẽ
không phù hợp cho hệ thống qui mô lớn, giả
sử có N máy thì mỗi máy sẽ phải giữ N-1 khóa và
cả hệ thống sẽ cần tới N(N-1)/2 khóa.
Để khắc phục vấn đề này có thể
sử dụng trung tâm phân phối khóa KDC (Key Distribution
Center), trung tâm chia sẻ khóa bí mật với mỗi máy
nhưng không có cặp máy nào phải có khóa bí mật, trung
tâm chỉ cần giữ N khóa. Nếu A muốn thiết
lập kênh an toàn với B thì A sẽ yêu cầu KDC trợ
giúp bằng cách gửi khóa bí mật cho cả A và B.

Hình 9.12 Nguyên lý sử dụng trung tâm phân
phối khóa
Đầu tiên A gửi thông điệp cho
KDC đề đạt nguyện vọng muốn kết
nối với B, KDC sẽ sinh khóa KA,B sau đó mã
hóa EKA,KDC(KA,B)
gửi cho A và EKB,KDC(KA,B) gửi cho B. Nhược điểm
chính của giải pháp này là A có thể bắt đầu
thiết lập kênh an toàn với B trong khi B chưa nhận
được khóa bí mật từ KDC, điều này có
thể khắc phục bằng cách KDC sẽ chuyển thẻ
EKB,KDC(KA,B) cho A
để A tự kết nối với B như minh
họa trên hình 9.13, B vẫn là đối tượng duy
nhất biết cách giải mã thẻ EKB,KDC(KA,B), các
phiên bản của giải pháp này là các giao thức Needham-Schroeder và Kerberos.

Hình 9.13 KDC cho phép hai bên tự kết
nối
Nếu sử dụng giao thức
Needham-Schroeder, A sẽ gửi yêu cầu đến KDC
chứa thẻ mời B bao gồm định danh của A
và số ngẫu nhiên RA1. KDC sẽ trả lởi
bằng cách trả về giá trị mã hóa EKA,KDC(RA1, B, KA,B, EKB,KDC(A, KA,B)), các giá trị RA1 và B trong tham số hàm mã hóa để A
kiểm chứng với giá trị nó đã gửi cho KDC
nhằm mục đích tránh tấn công phản xạ, thẻ EKB,KDC(A, KA,B) để A có thể thiết lập
liên kết với B.

Hình 9.14 Giao thức Needham-Schroeder
Sau khi nhận được kết quả
từ KDC, A sẽ sinh số ngẫu nhiên RA2 và thực
hiện mã hóa EKA,B(RA2), EKB,KDC(A,
KA,B) để gửi
cho B, nhận được
bản tin này B sẽ giải mã DKB,KDC(EKB,KDC(A,
KA,B)) và hiểu rằng A muốn thiết
lập liên kết với khóa bí mật là KA,B ,
dựa vào khóa này sẽ giải mã DKA,B(EKA,B(RA2)) và biết được giá trị RA2.
B sẽ sinh số ngẫu nhiên RB và gửi cho A giá
trị EKA,B(RA2-1, RB), RA2-1 chứ
không phải RA2 ngụ ý B đã biết khóa bí mật và sử
dụng khóa đó giải mã thành công, nhận
được bản tin A sẽ gửi cho B giá trị EKA,B(RB-1). Như
vậy giao thức đã chống được tấn
công phản xạ, tuy nhiên nếu kẻ tấn công C
biết được khóa cũ KA,B
thì sẽ gửi lại thông điệp thứ 3
để giả mạo A, trong trường hợp này
cần phải tạo mối ràng buộc giữa thông
điệp thứ ba với thông điệp đầu tiên,
giải pháp được thể hiện trên hình 9.15. Bí
quyết nằm ở chỗ trước khi kết
nối với KDC, A sẽ gửi thông điệp yêu
cầu kết nối với B, khi đó B sinh ra số
ngẫu nhiên RB1 và
trả về cho A giá trị mã hóa EKB,KDC(RB1), tất
nhiên A sẽ không giải mã được giá trị này mà
chỉ gửi kèm theo thông điệp gửi đến
KDC. Nhận được yêu cầu từ A, KDC sẽ
giải mã và biết được giá trị RB1 nên sẽ
gửi cho A thông điệp trả về giá trị EKA,KDC(RA1, B, KA,B, EKB,KDC(A,
KA,B, RB1)), các
bước tiếp theo tương tự như giao
thức cơ bản đã trình bày trên.

Hình 9.15 Giao thức Needham-Schroeder chống lại tái sử
dụng khóa phiên trước
Xác thực dựa trên mã hóa khóa công khai đòi
hỏi mỗi bên cần phải biết khóa công khai
của nhau, ký hiệu K+ là khóa công khai và K- là
khóa riêng bí mật. A bắt đầu phiên bằng cách sinh
số ngẫu nhiên RA và sử dụng khóa công khai K+ B để mã hóa
bản tin EK+B(A, RA) và gửi cho B, nhận
được thông điệp này B sẽ sử dụng
khóa riêng bí mật K- B để giải mã, nếu thành
công sẽ sinh số ngẫu nhiên RB
và khóa phiên KA,B sau đó sử dụng khóa công khai K+ A để mã hóa
bản tin EK+A(RA, RB, KA,B) và gửi cho A.

Hình 9.16 Xác thực lẫn nhau dựa trên
mã hóa khóa công khai
Nhận được
bản tin A sẽ sử dụng khóa riêng K- A để
giải mã, nếu thành công sẽ sử dụng khóa phiên KA,B để
mã hóa bản tin EKA,B(RB).
B nhận được bản tin sẽ sử dụng
khóa bí mật của phiên để giải mã, nếu giá
trị giải mã bằng RB
thì B tin rằng
đối tượng thiết lập kết nối
chắc chắn là A.
Bên cạnh việc xác
thực, kênh an toàn còn phải đảm bảo tính toàn
vẹn và bí mật cho thông điệp, tính toàn vẹn
bảo vệ thông điệp chống lại những sửa
đổi gian lận trong khi đó tính bí mật
đảm bảo thông điệp không bị đọc
trộm. Tính bí mật có thể thực hiện
được bằng cách sử dụng khóa bí mật
của các bên hoặc mã khóa công khai của bên nhận
để mã hóa thông điệp trước khi gửi, tuy
nhiên bảo vệ thông điệp không bị sửa
đổi là vấn đề phức tạp hơn
nhiều.
Xét một giao dịch thương
mại điện tử, A gửi thông điệp cho B
đồng ý mua hàng, có thể xảy ra hai tình huống gian
lận: A phủ nhận thanh toán vì cho rằng đó là thông
điệp giả mạo, B nâng tổng số tiền mà A
đã mặc cả. Hai tình huống này có thể giải
quyết nếu A sử dụng chữ ký số cho thông
điệp đã gửi, sự kết hợp duy nhất
giữa thông điệp và chữ ký số bảo vệ
không bị sửa đổi, A cũng không thể phủ
nhận nếu chứng minh được đó là chữ
ký của A. Một trong những cách phổ biến là
sử dụng mã hóa khóa công khai như RSA như minh họa
trên hình 9.17, A sử dụng khóa riêng K-A
để mã hóa gửi thông điệp gửi cho B, nếu
muốn bí mật nội dung thì có thể sử dụng
khóa công khai K+B ,
như vậy thông điệp gửi lên kênh truyền sẽ
là EK+B(m, EK-A(m)).

Hình 9.17 Chữ ký số sử dụng khóa mã
hóa công khai
Nhận được thông điệp, B
sẽ sử dụng khóa riêng của mình K-B
để giải mã, như vậy sẽ nhận
được bản rõ và bản mã của thông
điệp. Bên gửi sẽ không thể nghi ngờ bên
nhận đã sửa đổi thông điệp vì chỉ
sử dụng khóa công khai K+A để
giải mã EK-A(m),
nếu kết quả giải mã trùng khớp với
bản rõ m chứng tỏ bản tin đã không bị
sửa đổi và đó là bản tin mà A đã ký
trước khi gửi đi, bên gửi cũng không thể
chối bỏ trách nhiệm của mình. Tuy nhiên, tính hợp
lệ của chữ ký có thể duy trì khi khóa riêng của
bên gửi không bị lộ, vì vậy bên A vẫn có
thể chối bỏ với lý do khóa riêng đã bị
đánh cắp trước khi gửi thông điệp.

Hình 9.18 Chữ ký số sử dụng bản
thu gọn của thông điệp
Bên gửi hoàn toàn có quyền thay đổi
khóa riêng của mình, đây là việc bình thường vì
thường xuyên thay đổi khóa sẽ giúp chống
lại xâm nhập trái phép. Khi bên A thay đổi khóa thì
những thông điệp đã gửi cho B sẽ không có giá
trị, trường hợp này đòi hỏi phải có
một trung tâm quản lý lưu vết khóa để ghi
nhận thời điểm thay đổi và sử
dụng thêm nhãn thời gian cho chữ ký điện tử.
Ngoài ra có thể thấy việc mã hóa toàn bộ thông
điệp là công việc khá tốn kém về mặt
kỹ thuật, một giải pháp khác đơn giản
hơn là chỉ cần sử dụng chữ ký cho bản thu
gọn của thông điệp. Bản thu gọn thông
điệp là xâu bit có chiều dài cố định và
được tính toán từ thông điệp có chiều
dài bất kỳ bằng cách sử dụng hàm băm,
như vậy thay cho việc mã hóa cho toàn bộ thông
điệp m thì chỉ cần mã hóa cho xâu bit có chiều dài
cố định H(m), hình 9.18 minh họa cho quá trình này. Bên
B sẽ chỉ cần giải mã H(m) bằng khóa công khai
của bên A sau đó so sánh với kết quả thực
hiện hàm băm trên bản rõ nhận được,
nếu trùng khớp thì có thể khẳng định đó
là thông điệp do bên A đã ký trước khi gửi.
Trong truyền thông qua kênh an
toàn, sau khi hoàn thành xác thực nói chung các bên sẽ sử
dụng khóa phiên chia sẻ duy nhất để đảm
bảo bí mật, khóa phiên sẽ bị loại bỏ
một cách an toàn khi kênh không còn được sử
dụng nữa. Tất nhiên hoàn toàn có thể sử
dụng lại các khóa này, tuy nhiên việc sử dụng
lại có thể dễ dàng bị lộ, kẻ tấn công
có thể chặn những thông điệp sử dụng
cùng một khóa và tìm ra những đặc tính của khóa.
Vì vậy, sẽ an toàn hơn nhiều nếu sử
dụng các khóa xác thực càng ít càng tốt, nên sử
dụng các cơ chế băng ngoài và giữ ở mức
tối thiểu việc trao đổi các khóa. Một lý do
quan trọng khác, với việc sử dụng khóa phiên thì
các bên tham gia có thể được bảo vệ
trước những cuộc tấn công lặp lại, các
thông điệp cần phải được gắn
số tuần tự và nhãn thời gian.
Giả sử tính toàn vẹn
và bảo mật thông điệp đã đạt
được bằng cách sử dụng cùng một khoá
khi thiết lập phiên, nếu bị lộ khóa thì kẻ
đột nhập có thể giải mã các thông điệp
đã trao đổi trong những phiên trước, như
vậy sử dụng khóa phiên sẽ an toàn hơn rất
nhiều, nếu bị lộ khóa thì kẻ tấn công
chỉ có thể đọc được những thông
điệp trong phiên đó. Ngoài ra, ngay cả những
đối tượng nhận thông điệp cũng
không đáng tin cậy, do đó chỉ cần khóa phiên là
đủ để bảo đảm cho tính toàn vẹn và
bảo mật thông điệp cho những đối
tượng này, kết hợp sử dụng khóa lâu dài
với khóa phiên để
triển khai các kênh an toàn cũng là giải pháp tốt
cần được áp dụng.
Kênh truyền bảo mật
không chỉ giới hạn cho hai thành viên tham gia, trong
một số trường hợp có thể nhiều
hơn hai thành viên, ví dụ trao đổi thông tin giữa
các bản sao khi thực hiện nhân bản cũng phải
đảm bảo các yêu cầu về bảo mật.
Tính bí mật truyền thông trong
nhóm được thực hiện đơn giản
bằng cách yêu cầu tất cả các thành viên sử
dụng khóa bí mật của nhóm để mã hóa và giải
mã các thông điệp lưu chuyển giữa các thành viên
trong nhóm, tất nhiên mỗi thành viên sẽ phải nghiêm túc
thực hiện giữ bí mật cho khóa này. Giải pháp thứ
hai phức tạp hơn nhưng lại đảm bảo
bí mật hơn, từng cặp thành viên sẽ sử
dụng một khóa bí mật,
như vậy nếu nhóm có N thành viên sẽ cần phải
có N(N - 1)/2 khóa. Giải pháp thứ ba dung hòa hai giải pháp
trên bằng cách sử dụng hệ thống mã hóa khóa công
khai, mỗi thành viên sở hữu cặp khóa công khai và khóa
riêng, khóa công khai sẽ chia sẻ cho tất cả các thành
viên để gửi các thông điệp bí mật. Như
vậy chỉ cần quản lý N khóa, nếu một thành
viên không còn đáng tin cậy thì chỉ cần loại
bỏ khóa của thành viên đó ra khỏi nhóm mà không
ảnh hưởng đến các khóa khác.
Xét trường hợp khá phức tạp,
máy khách gửi yêu cầu đến nhóm các máy chủ nhân
bản, các máy chủ có thể được nhân bản
vì lý do đảm bảo tính chịu lỗi và hiệu
năng, vì bất kỳ lý do nào thì máy khách chỉ mong
đợi kết quả trả về đáng tin cậy.
Xét trên góc độ bảo mật thông tin, máy khách không
muốn trở thành nạn nhân của các vụ tấn công
bảo mật, dù cho một trong số các máy chủ đã
bị hư hỏng vì những cuộc tấn công đó. Máy
khách có thể tập hợp kết quả trả về
từ các máy chủ và xác thực chúng, nếu đa số
đều được xác thực thì có thể tin
cậy vào kết quả, tuy nhiên giải pháp này đã vi
phạm tính trong suốt nhân bản.
Năm 1994 Reiter đã đề xuất
giải pháp bảo mật máy chủ nhân bản nhưng
vẫn duy trì được tính trong suốt nhân bản,
máy khách không biết các bản sao thực sự, do đó có
thể thêm hoặc bớt theo cách thức bí mật.
Bản chất của bảo mật và các máy chủ nhân
bản trong suốt nằm ở cách chia sẻ bí mật,
tất cả đều biết bí mật nhưng không ai
biết toàn bộ bí mật trừ khi họ tập trung
lại với nhau. Trong trường hợp bảo
mật, k trong số N máy chủ có thể trả về
kết quả không chính xác và trong đó nhiều nhất là
c ≤ k thực sự bị ảnh hưởng bởi
tấn công bảo mật, cần thiết phải phân
biệt giữa lỗi máy chủ với lỗi do tấn
công bảo mật. Xét trường hợp máy khách gửi
yêu cầu đồng thời đến N máy chủ nhân
bản, để bảo đảm bí mật nhóm các máy
chủ nhân bản thì mỗi kết quả trả về
phải đính kèm chữ ký số. Ký hiệu ri là
kết quả trả về của máy chủ Si,
md(ri) là bản thu gọn bằng cách sử
dụng khóa riêng K-i của máy chủ Si,
hệ thống phải có khả năng chịu
đựng được c máy chủ bị hủy
hoại khi xảy ra tấn công bảo mật, như
vậy vấn đề sẽ được giải
quyết nếu có ít nhất c+1 chữ ký để
đảm bảo chữ ký hợp lệ cho kết quả
trả về.

Hình 9.19 Chia sẻ chữ ký bí mật trong nhóm
các máy chủ nhân bản
Ví dụ trên hình 9.19, nhóm gồm 5 máy chủ
nhân bản như vậy có thể chịu được
2 máy chủ sụp đổ khi xảy ra tấn công
bảo mật. Mỗi máy chủ S i trả về
kết quả ri kèm theo bản tóm tắt md(ri)
trong chữ ký cho máy khách sig(Si, ri) = K-i
(md(ri)), như vậy máy khách sẽ nhận
được 5 cặp dữ liệu này. Máy khách tính toán
bản tóm tắt cho mỗi kết quả trả về ri,
nếu kết quả trả về ri không chính xác
thì sẽ bị thể phát hiện khi thực hiện giải
mã DK+i (DK-i (md(ri))), tuy nhiên
phương pháp này không còn được sử dụng
nữa vì không một máy chủ riêng nào được tin
cậy. Thay vào đó, máy khách sử dụng hàm giải mã D
với đầu vào gồm
ba tập chữ ký và cho ra
kết quả một bản tóm tắt:
d = D(sig(S,r),
sig(S’,r’), sig(S”,r”))
Như
vậy sẽ có tổng cộng 5!/(3!2!)=10 khả năng
xảy ra, chỉ cần một trường hợp cho
kết quả chính xác bản tóm tắt md(ri)
đối với kết quả ri nào đó thì có thể coi ri
là kết quả trả về chính xác, máy khách có thể tin
cậy kết quả trả về nếu có ít nhất 3
máy chủ cho kết quả xác thực chính xác. Ví dụ
trên có thể được tổng quát hóa trên
trường hợp n=N máy chủ và ngưỡng chịu
đựng m = c+1 là ngưỡng chịu lỗi do bị
tấn công bảo mật và gọi là lược
đồ ngưỡng (m,n), áp dụng thực tế
một bản tin sẽ được chia thành n phần
và chỉ có thể dựng lại bản tin khi biết
chính xác ít nhất m phần.
Có thể thấy việc kết hợp
bảo mật vào trong hệ thống phân tán không phải
đơn giản, chỉ cần một bộ phận
không an toàn thì có thể tổn hại cho cả hệ
thống. Để trợ giúp cho việc xây dựng các
hệ thống phân tán có thể thực thi vô số các chính
sách bảo mật, một số hệ thống hỗ
trợ đã được phát triển và có thể
sử dụng làm cơ sở cho việc phát triển
tiếp, một trong những hệ thống đang
được sử dụng rộng rãi là Kerberos. Kerberos
dựa trên giao thức Needham-Schroeder và có thể coi như
hệ thống bảo mật trợ giưps máy khách
thiết lập kênh bí mật với máy chủ của
hệ thống phân tán, tính bảo mật dựa trên các khóa
bí mật chia sẻ. Hệ thống gồm hai thành
phần, máy chủ xác thực AS có nhiệm vụ xử lý
các yêu cầu đăng nhập của người sử
dụng, nếu xác thực người sử dụng thành
công sẽ cung cấp khóa để thiết lập các kênh bảo
mật với máy chủ, thiết lập kênh bảo
mật với máy chủ do dịch vụ cấp thẻ
TGS thực hiện.

Hình 9.20 Xác thực trong Kerberos
Khi A đăng nhập vào hệ thống phân
tán sử dụng Kerberos để thiết lập kênh
bảo mật với B, máy khách sẽ gửi tên
đăng nhập đến máy chủ AS và nhận
được khóa KA,TGS và thẻ cần thiết
để chuyển cho thành phần cung cấp dịch
vụ TGS. Thẻ chứa định danh của A và
chỉ có thành phần TGS mới đọc được
thông tin này, vì vậy nó được mã hóa bằng khóa bí
mật KAS,TGS. Máy khách của A sẽ mã hóa mật
khẩu bằng khóa KA,AS, như vậy mật
khẩu sẽ được mã hóa khi truyền trên
mạng và máy khách cũng không lưu được bản
rõ của mật khẩu, hơn nữa ngay sau khi khóa chia
sẻ KAS được sinh ra thì máy khách sẽ tìm
thấy khóa phiên K AS,TGS, có thể quên đi mật
khẩu của A, chỉ sử dụng khóa bí mật chia
sẻ KA,AS.
Sau khi hoàn thành xác thực, A có thể coi
như đã thâm nhập vào hệ thống và thẻ sẽ
được lưu tạm thời trong AS khoảng 8
đến 24 giờ và dùng để truy nhập các
dịch vụ từ xa, tất nhiên A phải xỏa
dữ liệu đã lưu trên máy khách. Nếu muốn nói
chuyện với B, A phải yêu cầu khóa phiên cho B như
trên hình 9.20, TGS sẽ trả về khóa phiên KA,B
trong thẻ để sau này A sẽ chuyển cho B. Thông
điệp thứ 6 chưa nhãn thời gian đã
được mã hóa để chống lại tấn công
lặp, TGS sẽ kiểm tra nhãn thời gian nếu quá
hạn thì sẽ bị từ chối. Nếu A muốn làm
việc với máy chủ khác của hệ thống mà không
thay đổi máy khách thì không cần phải xác thực
lại, về nguyên tắc các máy chủ đã ủy
quyền xác thực cho máy chủ AS.

Hình 9.21 Thiết lập kênh bảo mật
trong Kerberos
Việc thiết lập liên kết với B
giờ đây đã trở nên đơn giản như minh
họa trên hình 9.21, máy tính của A gửi cho máy tính của
B thông điệp chứa thẻ đã nhận
được cấp từ dịch vụ TGS kèm theo nhãn
thời gian đã được mã hóa, máy tính của B
nhận được sẽ giải mã và biết rằng
A muốn nói chuyện với B vì chỉ có TGS mới xây
dựng được thẻ này. Máy tính của B cũng
nhận được khóa bí mật KA,B để
kiểm tra nhãn thời gian, bằng thông điệp trả
về EKA,B(t+1)
sẽ chứng minh cho A tính chính danh của B.
Trong mô hình khách/chủ, mỗi khi máy khách
và máy chủ thiết lập kênh bảo mật, máy khách có
thể gửi yêu cầu để máy chủ thực
hiện, những yêu cầu đó đòi hỏi thực
hiện các thao tác trên tài nguyên do máy chủ kiểm soát. Tài
nguyên trên máy chủ gồm nhiều đối tượng
và máy khách chỉ được phép thao tác trên các
đối tượng đó nếu được
cấp quyền truy nhập, việc kiểm tra quyền
truy nhập còn gọi là kiểm soát truy nhập, hai khái
niệm này liên quan mật thiết với nhau. Để
bảo mật hệ thống cần thiết phải xây
dựng các chính sách kiểm soát các thao tác của người
sử dụng trên máy chủ, có thể xây dựng bức
tường lửa hoặc một hệ thống kiểm
soát truy nhập.
Kiểm soát truy nhập đối
tượng bao gồm tất cả những biện pháp
bảo vệ đối tượng chống lại
những thao tác bất hợp pháp trên đối
tượng, đó có thể là những vấn đề
liên quan tới quản lý hay những vấn đề liên
quan tới thao tác trên đối tượng.

Hình 9.22 Nguyên lý kiểm soát truy nhập
đối tượng
Việc bảo vệ do thành phần giám
sát tham chiếu đảm nhiệm, thành phần này chứa
danh sách những chủ thể được phép thực
hiện thao tác, nó sẽ được sử dụng
mỗi khi gọi đối tượng, như vậy
thành phần này đóng vai trò rất quan trọng và không
thể bị kẻ tấn công đánh lừa.
Cách đơn giản nhất
thường được áp dụng là xây dựng ma
trận kiểm soát truy cập, đó là một ma trận
gồm hàng biểu diễn cho một chủ thể truy
nhập và cột biểu diễn cho tài nguyên, giá trị
chứa trong mỗi phần tử của ma trận
thể hiện quyền người sử dụng
được thao tác trên tài nguyên đó. Ký hiệu ma
trận là M, S là chủ thể truy nhập và O là
đối tượng truy nhập, khi đó M[s,o] gồm
danh sách những thao tác mà chủ thể S có thể thực
hiện trên đối tượng O. Nếu chủ
thể S thực hiện gọi thao tác trên m trên đối
tượng O, thành phần giám sát tham chiếu sẽ
kiểm tra xem thao tác m có xuất hiện trong danh sách M[s,o],
nếu có thì cho phép thực hiện, ngược lại
sẽ không cho phép tiếp tục thực hiện và như
vậy lời gọi thao tác coi như thất bại.

Hình 9.23 Danh sách kiểm soát truy nhập
Thông thường hệ thống sẽ
có rất nhiều người sử dụng và hệ
thống có thể gồm hàng ngàn đối tượng
cần được bảo vệ, do đó xây dựng
một ma trận thực như trên là không hợp lý, nhiều
mục trong ma trận sẽ rỗng. Giải pháp thứ
nhất gọi là danh sách kiểm soát truy cập ACL (Access
Control List), nghĩa là ma trận được phân tán theo
cột và những mục rỗng sẽ bị bỏ qua, mỗi
đối tượng sẽ duy trì danh sách các quyền truy
nhập của các chủ thể muốn truy nhập
đối tượng, như vậy mối đối
tượng sẽ có một danh sách kiểm soát truy
nhập riêng.

Hình 9.24 Kiểm soát theo khả năng
Giải pháp thứ hai là phân tán theo hàng,
mỗi chủ thể sẽ được cấp
những khả năng được phép thao tác với
mỗi đối tượng tương đương
với mỗi mục trong ma trận kiểm soát truy
nhập. Khả năng được phép thao tác có thể
coi như một tấm thẻ trên đó ghi những
quyền được phép thực hiện, như vậy
cần thiết phải có cơ chế để chủ
thể sở hữu không được phép thay
đổi các quyền trên tấm thẻ này. Hai giải
pháp trên khác nhau ở cơ
chế vận hành kiểm soát, danh sách kiểm soát truy
nhập cần phải biết chủ thể trong khi
đó giải pháp sử dụng khả năng chỉ quan
tâm tới thao tác yêu cầu thực hiện có xuất
hiện trong danh sách khả năng hay không.
Danh sách kiểm soát truy nhập tuy đã
khắc phục được nhược điểm
của ma trận kiểm soát truy nhập bằng cách
loại bỏ những mục rỗng, tuy nhiên kích
thước của chúng vẫn còn rất lớn,
để giảm kích thước của danh sách kiểm
soát truy nhật thì cần phải đưa ra khái niệm
miền bảo vệ. Miền bảo vệ là một
tập các cặp đối tượng và quyền truy
nhập, mỗi cặp xác định chính xác một
đối tượng và các thao tác hợp lệ trên nó, các
yêu cầu thực hiện thao tác đều thuộc
một miền bảo vệ. Khi một chủ thể yêu
cầu thao tác trên đối
tượng, tiến trình giám sát sẽ tìm trong miền
bảo vệ liên quan với yêu cầu này để
biết có được phép thực hiện hay không.
Để đạt hiệu quả cao hơn,
người ta dùng kết hợp miền bảo vệ với
việc phân nhóm các đối tượng, việc phân nhóm
các đối tượng có thể hiểu tương
tự như cách quản lý vai trò của người
sử dụng.
Các giải pháp mã hóa kết hợp và cài
đặt kiểm soát truy nhập sẽ hoạt
động tốt khi các bên tham gia đều tuân thủ
những qui tắc xác định, điều này chỉ
đúng khi hệ thống phân tán cách ly với thế
giới bên ngoài. Vấn đề trở nên phức
tạp hơn khi hệ thống cung cấp các dịch
vụ công cộng, để bảo vệ hệ thống
chắc chắn sẽ cần thêm những giải pháp khác.
Trong thực tế, truy nhập từ bên ngoài đến
hệ thống phân tán phải được kiểm soát
bằng một công cụ đặc biệt gọi là
tường lửa. Tường lửa dùng để
ngăn chặn các luồng không được phép, chúng có
thể lọc thông tin từ mức mạng đến
tầng ứng dụng, về nguyên tắc nó phải có
khả năng bảo vệ chống lại các hiểm
họa bảo mật và không bao giờ bị lỗi.

Hình 9.25 Cài đặt tường lửa
Về cơ bản, tường lửa
gồm hai loại, tường lửa lọc gói tin và
tường lửa lọc nội dung. Tường lửa
lọc gói tin hoạt động như một thiết
bị định tuyến cho phép hoặc không cho phép gói tin
chuyển qua mạng dựa trên địa chỉ nguồn
và địa chỉ đích của gói tin, thường dùng
để ngăn chặn các gói tin từ ngoài đi vào trong
mạng. Trường hợp hệ thống phân tán cài
đặt trên nhiều mạng cục bộ thì có thể
sử dụng mạng riêng ảo để kết nối
các mạng này nhưng vẫn duy trì được
tường lửa. Mạng riêng ảo là một kênh truyền bảo
mật trên môi trường mạng công cộng nhằm
tiết kiệm về chi phí so với việc sử
dụng các kênh thuê riêng, nó sử dụng các giao thức đường
hầm cho phép đảm bảo tính toàn vẹn, bí mật
thông tin, xác thực và mã hóa dữ liệu trên kênh truyền.
Tường lửa mức ứng dụng không những
kiểm tra thông tin điều khiển của gói tin mà còn kiểm
tra nội dung của gói tin đó.
Di trú mã là một trong những kỹ thuật
nhằm nâng cao hiệu năng xử lý của hệ
thống phân tán, tuy nhiên đây cũng là một trong
những hiểm họa bảo mật. Các đoạn mã
của Agent phải được bảo mật
để chống lại những sửa đổi và
đồng thời các máy tính cũng phải có khả
năng chống lại những Agent độc hại.
Agent di động lang thang trên hệ
thống phân tán để tìm kiếm thông tin, tất nhiên
phải có cơ chế bảo mật để sao cho khi
đến một trạm nào đó bản thân Agent sẽ
không bị đánh cắp hoặc sửa đổi thông
tin. Rất tiếc cho đến nay chưa có một
giải pháp đầy đủ nào để có thể
thực hiện yêu cầu này, vì vậy cần tổ
chức sao cho ít nhất cũng có thể phát hiện
được những sửa đổi các Agent. Chủ
sở hữu có thể phát hiện Agent đã bị
giả mạo dựa trên ba cơ chế: trạng thái
chỉ đọc, chỉ thêm nhật ký và tiết lộ
trạng thái cho một số máy chủ nhất
định. Trạng thái chỉ đọc của Agent
gồm tập các mục dữ liệu đã
được chủ sở hữu ký trước khi
gửi đến máy tính khác, khi Agent trở về chỉ
cần kiểm tra chữ ký có trùng khớp với nguyên
gốc hay không. Cơ chế chỉ thêm nhật ký nghĩa
là chỉ được phép thêm mà không được phép
sửa hoặc xóa những bản ghi trước, ban
đầu nhật ký rỗng và chỉ chứa giá trị
kiểm tra Cinit=EK+Owner(N), trong đó K+Owner
là khóa công khai của chủ sở hữu Agent và N là giá
trị chứa định danh của chủ sở
hữu. Khi Agent chuyển đến máy S, nó thêm dữ
liệu X,S vào nhật ký kèm theo chữ ký sig(S,X) và tính giá
trị kiểm tra mới Cnew=EK+Owner(Cold,
sig(S,X),S) trong đó Cold là giá trị kiểm tra
cũ. Lúc Agent trở về, chủ sở hữu dễ
dàng phát hiện nhật ký có bị giả mạo hay không
bằng cách đọc từ cuối nhật ký, giải mã
DK-Owner(C),
mỗi bước sẽ trả về giá trị kiểm
tra của bước kế tiếp và chữ ký sig(S,X) cho
máy S, nếu không bị giả mạo thì xử lý và
thực hiện bước tiếp theo. Vòng lặp sẽ
dừng lại khi tiến đến giá trị kiểm tra
ban đầu hoặc khi phát hiện mục dữ liệu
bị giả mạo. Cơ chế thứ ba
được thực hiện bằng cách cung cấp
một mảng mục dữ liệu, mỗi mục là
một máy chủ xác định và được mã hóa
bằng khóa công khai của máy chủ đó, toàn bộ
mảng được chủ sở hữu Agent ký
để đảm bảo tính toàn vẹn. Nếu một
mục dữ liệu bị thay đổi giả mạo
thì các máy chủ sẽ thông bao và có thể thực hiện
các biện pháp thích hợp.
Bảo vệ mã di động chống
lại những máy phá hoại là quan trọng nhưng
bảo vệ các máy tính trước những mã di
động phá hoại còn quan trọng hơn. Nếu coi
việc gửi Agent ra thế giới bên ngoài là nguy hiểm
thì nhìn chung người sử dụng có nhiều lựa
chọn để lấy kết quả từ những
Agent này, tuy nhiên để cho phép Agent thâm nhập vào hệ
thống thì chỉ có duy nhất một cách là kiểm tra
toàn bộ Agent, người sử dụng cần phải
kiểm soát toàn bộ những gì Agent có thể thực
hiện. Không có cách nào bảo vệ được
Agent trước những thay
đổi mang tính chất phá hoại nhưng lại có
thể phát hiện sửa đổi trên nó, trong tình
huống xấu nhất thì từ chối tiếp nhận
khi nó trở về. Có thể sẽ quá muộn nếu
như phát hiện mã độc hại sau đã khi xâm
nhập vào hệ thống, vì vậy cần phải
bảo vệ tất cả các tài nguyên chống lại các
đoạn mã tải xuống truy nhập trái phép. Một
trong những cách bảo vệ là xây dựng hộp cát,
đó là kỹ thuật kiểm soát toàn bộ tất
cả các chỉ thị lệnh, nếu phát hiện
thấy lệnh nào bị cấm thì dừng ngay
chương trình. Tương tự như vậy, việc
thực thi đoạn mã tải về sẽ bị
tạm dừng nếu phát hiện thâm nhập vào thanh ghi
hoặc những vùng nhớ máy tính không cho phép.

Hình 9.26 Cấu trúc hộp cát Java
Cài đặt hộp cát khá phức
tạp, có thể kiểm tra mã thực hiện khi tải
xuống và chèn thêm các chỉ thị lệnh cho những
trường hợp chỉ có thể kiểm tra khi
chạy, điều này khá đơn giản đối
với những đoạn mã thông dịch. Mỗi
chương trình viết bằng Java bao gồm các lớp
và từ đó tạo ra các đối tượng, không có
các biến toàn cục và các hàm, tất cả đều nằm
được khai báo trong các lớp, việc thực thi
chương trình bắt đầu tằ phương
thức gọi hàm chính. Chương trình viết bằng Java
được biên dịch thành các chỉ thị lệnh
để từ đó sẽ được thông dịch
bằng máy ảo Java, vì vậy máy ảo Java sẽ lần
lượt xử lý từng chỉ thị lệnh của
chương trình đã tải về bằng cách biên
dịch thành các chỉ thị lệnh của nó, bắt
đầu từ chương trình chính. Trong hộp cát Java,
việc bảo vệ bắt đầu bằng cách
đảm bảo thành phần xử lý chuyển
chương trình đến máy khách có thể tin cậy,
tải xuống trong Java do tiến trình nạp lớp
đảm nhiệm. Mỗi thành phần nạp lớp có
trách nhiệm lấy lớp xác định từ máy
chủ và cài đặt trên không gian địa chỉ
của máy khách, như vậy máy ảo Java có thể
tạo các đối tượng từ những lớp
đó. Vì thành phần nạp lớp chỉ là một
lớp Java khác, chương trình đã tải về có
thể chứa thành phần nạp lớp của riêng nó,
hộp cát đầu tiên sẽ xử lý những thành
phần nạp lớp đáng tin cậy sẽ
được sử dụng, chương trình Java không cho
phép tạo các thành phần nạp lớp riên nếu chúng
phá vỡ phương thức nạp lớp thông
thường vẫn xử lý.
Thành phần thứ hai của hộp cát là
trình kiểm tra mã byte, nó kiểm ta xem lớp đã tải
về có tuân thủ các qui tắc bảo mật của
hộp cát hay không, đặc biệt nó kiểm tra xem
lớp đó có chứa các chỉ thị lệnh bất
hợp pháp hoặc những lệnh làm hỏng ngăn
xếp hoặc bộ nhớ hay không. Không phải kiểm
tra tất cả các lớp mà chỉ tập trung vào
những lớp được tải từ máy chủ bên
ngoài về máy khách, nói chung những lớp nằm trên máy
khách đều đáng tin cậy. Khi tải xuống
một lớp và đã kiểm tra an toàn, máy ảo Java có
thể khởi tạo và thực hiện các phương
thức của đối tượng, để ngăn
chặn các đối tượng truy nhập trái phép vào
tài nguyên của máy khách, trình quản lý bảo mật
thực hiện những kiểm tra khác nhau trong khi
chạy.

Hình 9.27 Hộp cát và sân chơi
Các chương trình tải về buộc
phải sử dụng trình quản lý bảo mật
để không có cách nào gây tổn hại, nghĩa là
mọi thao tác đều phải tuân thủ yêu cầu
của trình bảo mật. Trình bảo mật sẽ
cấm nhiều thao tác như từ chối truy nhập vào
các tập tin cục bộ và chỉ cho phép thiết
lập kết nối đến các máy chủ nguồn
gốc của các chương trình đã tải về, tuy
nhiên chúng có thể tuy nhập đến thư viện
đồ họa để phục vụ cho mục
đích hiển thị hoặc bắt các sự kiện
như di chuyển chuột hoạc bấm chuột vào các
nút điều khiển. Trình bảo mật Java ban
đầu được cài đặt rất khắt
khe, chúng không phân biệt các chương trình đã tải
từ những máy chủ khác nhau, trong nhiều
tường hợp chúng đã giới hạn quá mức và
cần thiết phải linh hoạt hơn.
Một cách tiếp cận khác
tương tự như hộp cát nhưng linh hoạt
hơn là tạo ra một sân chơi cho mã di động
tải về, sân chơi là một máy riêng biệt chỉ
dành cho mã di động đang chạy. Tài nguyên cục
bộ như các tập tin và các kết nối đến
máy chủ bên ngoài đều có sẵn cho các chương
trình chạy tại sân chơi với các cơ chế
bảo mật thông thường. Tuy nhiên các tài nguyên cục
bộ đến các máy khác bị ngắt vật lý và mã
tải về không thể truy nhập được,
người sử dụng trên các máy khác có thể truy
nhập đến sân chơi như cách thông thường,
ví dụ gọi thủ tục từ xa, nhưng không
một mã di động nào được tải về các
máy cục bộ.

Hình 9.28 Nguyên lý sử dụng tham
chiếu đối tượng
Hướng tới mục tiêu tăng
độ linh hoạt đòi hỏi mỗi chương
trình tài về phải được xác thực và sau
đó thực thi chính sách bảo mật riêng dựa trên
nguồn gốc của chương trình. Mục tiêu
thứ nhất có thể thực hiện bằng cách
sử dụng chữ ký cho mã di động như những
văn bản thông thường, có thể áp dụng như
một phương án dự phòng cho hộp cát, như
vậy chỉ những mã máy chủ tin cậy mới
được tiếp nhận. Vấn đề thứ
hai thực thi chính sách bảo mật sẽ phức tạp
hơn, có thể dựa trên việc sử dụng tham
chiếu đối tượng như những khả
năng được phép thực hiện, để truy
nhập vào tài nguyên cục bộ thì phải tham chiếu
đến đối tượng riêng xử lý các thao tác
khi tải chương trình, nếu không có tham chiếu nào
thì không được phép thực hiện. Ban đầu,
chương trình không nhìn thấy tất cả các giao
diện của đối tượng thao tác với
tập tin hệ thống bằng cách không chuyển tham
chiếu cho những giao diện này, như vậy
đảm bảo không thể xây dựng bất kỳ tham
chiếu nào tới một trong những giao diện đó
trong thời gian chạy. Hơn nữa có thể sử
dụng thuộc tính của Java để giữ cho biên và
các phương thức hoàn toàn thuộc về bên trong
của lớp, chương trình có thể được bảo
vệ chống lại việc khởi tạo một
đối tượng riêng xử lý tập tin bằng cách
che giấu thao tác tạo các đối tượng mới
từ một lớp đã cho.

Hình 9.29 Nguyên lý kiểm tra bên trong ngăn
xếp
Cơ chế thứ hai thực thi chính
sách bảo mật là kiểm tra bên trong ngăn xếp,
về bản chất nghĩa là trước khi gọi
bất kỳ phương thức truy nhập tài nguyên
cục bộ thì phải gọi một thủ tục
kiểm tra xem thủ tục đó có được phép
gọi thủ tục thao tác với tài nguyên hay không,
nếu được ủy quyền thì mở quyền
tạm thời trong thời gian gọi thủ tục
đó, trước khi trả quyền điều khiển
cho phương thức gọi sẽ gọi thủ
tục để đóng quyền truy nhập. Để
gọi thủ tục mở/đóng quyền truy nhập,
có thể yêu cầu lập trình viên giao diện đến
tài nguyên cục bộ chèn những lời gọi này vào
những vị trí thích hợp, tuy nhiên sẽ tốt hơn
nếu để trình thông dịch của Java tự
động xử lý những lời gọi này. Khi gọi
đến tài nguyên cục bộ, trình thông dịch Java tự động mở quyền
thực hiện và kiểm tra xem lời gọi có
được phép thực hiện hay không, nếu
được thì đẩy lời gọi đóng
quyền thực hiện vào ngăn xếp để
đảm bảo chắc chắn quyền thực
hiện sẽ bị cấm khi phương thức
gọi trở về, giải pháp này ngăn chặn
những lập trình viên phá hoại phá vỡ qui tắc
Phương pháp này cho phép kiểm tra
tốt hơn quyền thực thi, giả sử
chương trình gọi đối tượng cục
bộ 01 và đối tượng đó lại gọi
đối tượng 02, mặc dù đối
tượng 01 có thể được cấp quyền gọi
đối tượng 02, nếu chủ thể gọi
đối tượng 01 không được tin cậy
để gọi phương thức thuộc về
đối tượng 02 thì kiểu gọi dây chuyền
đó cũng không được phép. Kiểm tra bên trong
ngăn xếp dễ dàng kiểm tra những chuỗi
như vậy, trình thông dịch chỉ cần kiểm tra mỗi
khung ngăn xếp bắt đầu từ đỉnh
để biết khung nào đã mở quyền thực thi
hoặc khung nào cấm truy nhập đến tài nguyên
hiện hành. Về cơ bản có thể nói kiểm tra bên
trong ngăn xếp cho phép đính kèm các quyền vào lớp
hoặc phương thức và kiểm tra những
quyền này cho mỗi lần gọi riêng biệt, bằng
cách náy có thể thực hiện miền bảo vệ
dựa trên lớp.
Cách tiếp cận thứ ba để
thực thi chính sách bảo mật là quản lý không gian tên,
để truy nhập đến tài nguyên cục bộ thì
chương trình phải tích hợp những tập tin
thích hợp chứa các lớp thực hiện những tài
nguyên đó. Việc tích hợp đòi hỏi phải cung
cấp tên cho trình thông dịch, sau đó phân giải thành
lớp và sau đó được nạp trong thời gian
chạy. Để thực thi chính sách bảo mật cho
một chương trình tài xuống, cùng một tên có thể
phân giải thành các lớp khác nhau tùy thuộc vào việc
chương trình được tải từ đâu. Thông
thường việc phân giải tên do thành phần nạp
lớp xử lý, nó cần phải được
điều chỉnh để thực hiện cách tiếp
cận này.
Những cách tiếp cận trên liên
kết quyền thực hiện với các lớp và các
phương thức dựa trên địa điểm
tải chương trình xuống, với ưu điểm
của trình thông dịch Java có thể thực thi chính sách
bảo mật thông qua các cơ chế đã trình bày trên
đây. Theo nghĩa này, kiến trúc bảo mật phụ
thuộc vào ngôn ngữ bậc cao và cần phải phát
triển ngôn ngữ mới. Các giải pháp độc
lập ngôn ngữ đòi hỏi cách tiếp cận
tổng quát hơn để thực thi bảo mật và
cũng khó cài đặt hơn, trong những trường
hợp này cần có sự trợ giúp bảo mật
của bệ điều hành nhận biết mã di
động tải xuống và thực thi tất cả
những lời gọi đến tài nguyên cục bộ
để chạy qua phần
lõi, nơi sẽ tiếp tục thực hiện kiểm
tra.
Nói chung, kiểm soát truy nhập
đảm bảo cẩn thận chỉ những tiến
trình ủy quyền mới được truy nhập tài
nguyên, một loại tấn công quấy nhiễu liên quan
tới kiểm soát truy nhập bằng cách róc tâm ngăn
cản những tiến trình đã được ủy
quyền truy nhập tài nguyên. Việc phòng thủ chống
lại những cuộc tấn công từ chối dịch
vụ (DoS: Denial of Service) ngày càng trở nên quan trọng khi
hệ thống phân tán đã mở trên toàn mạng Internet,
nếu những cuộc tấn công này chỉ xuất phát
từ vài điểm thì có thể dễ dàng xử lý,
vấn đề sẽ phức tạp hơn nhiều khi
phải chống lại những cuộc tấn công từ
chối dịch vụ phân tán (DDoS: Distributed Denial of Service).
Tấn công DDoS tập hợp một lượng rất
lớn tiến trình để cố gắng triệt
hạ dịch vụ mạng, kẻ tấn công đã thành
công trong việc cướp một lượng lớn máy
tính vô tình tham gia tấn công, chúng có thể chiếm hết
băng thông hoặc tê liệt tài nguyên. Việc chiếm
hết băng thông được thực hiện
đơn giản bằng cách gửi rất nhiều thông
điệp đến một máy làm cho những thông
điệp bình thường khó có thể tiếp cận
đến máy đó, tấn công tê liệt tài nguyên làm cho bên
cung cấp dịch vụ không còn khả năng vận hành
bình thường, ví dụ làm
cho máy tính ngập lụt trong việc xử lý các yêu
cầu thiết lập liên kết của giao thức TCP.
Không có biện pháp đơn lẻ nào
chống lại tấn công DDoS, kẻ tấn công cử
dụng những nạn nhân vô tội bằng cách bí mật
cài đặt phần mềm lên máy tính của họ. Trong
những trường hợp này giải pháp duy nhất là
phải có máy liên tục giám sát trạng thái bằng cách
kiểm tra các tập tin bị nhiễm, xem xét bằng cách
nào virus có thể phát tán trên mạng Internet. Chỉ dựa
vào biện pháp đối phó này thì chưa đủ,
cần thiết phải liên tục giám sát lưu lượng
mạng, ví dụ bắt đầu từ những
thiết bị định tuyến cửa ngõ của
mạng. Kinh nghiệm cho thấy loại bỏ những
gói tin có nguồn gốc không thuộc mạng của cơ
quan có thể ngăn chặn rất nhiều những
cuộc tàn phá, nói chung lọc được nhiều gói
tin càng gần nguồn càng tốt. Hai trong số các nguyên
tắc cơ bản về danh sách kiểm soát truy nhập,
danh sách kiểm soát truy nhập chuẩn thì đặt càng
gần đích càng tốt trong khi danh sách kiểm soát truy
nhập mở rộng thì đặt càng gần nguồn
càng tốt.
Có thể tập trung vào những
thiết bị định tuyến cửa ngõ vào mạng
của cơ quan, tuy nhiên điều này có thể đã quá
muộn vì có thể sẽ chặn cả những
người sử dụng thông thường. Tốt
hơn hết là phải xử lý từ những thiết
bị định tuyến của nhà cung cấp dịch
vụ Internet bằng cách lọc những gói tin nghi là
tấn công, thiết bị định tuyến sẽ
loại bỏ những gói tin nếu phát hiện thấy
tỉ lệ không cân đối giữa lưu lượng
nhận và gửi từ một nút mạng nào đó. Nói
chung, cần thiết phải triển khai rất nhiều
biện pháp để chống lại tấn công từ
chối dịch vụ, hơn nữa những hình thức
tấn công mới càng ngày càng
đa dạng và hiểm độc hơn.
Những phần trên đã xem xét các kênh
bảo mật và kiểm soát truy nhập nhưng hầu
như chưa đề cập đến vấn
đề lấy các khóa như thế nào, phần này
sẽ trình bày kỹ hơn về quản lý bảo mật.
Thứ nhất cần xem xét quản lý chung các khóa mã hóa,
cách phân phát các khóa này, từ đó thấy được
tầm quan trọng của các chứng chỉ. Thứ hai
là thảo luận quản lý bảo mật nhóm các máy chủ bằng cách
tập trung vào vấn đề thêm thành viên mới đã
được thành viên hiện hành tin cậy, đối
mặt với dịch vụ phân tán và nhân bản thì
điều quan trọng là vấn đề bảo mật
sẽ không bị ảnh hưởng khi tiếp nhận
tiến trình độc hại vào nhóm. Vấn đề
thứ ba chú trọng vào việc quản lý ủy quyền
bằng cách xem xét những khả năng và những thứ được
gọi là chứng chỉ thuộc tính, vấn đề
quan trọng trong các hệ thống phân tán liên quan
đến quản lý ủy quyền là một tiến trình
có thể ủy thác quyền truy nhập của nó cho
một tiến trình khác.
Khi giới thiệu các giao thức mã hóa
chúng ta đã ngầm hiểu các khóa đã sẵn sàng, ví
dụ trường hợp các
hệ thống mã khóa công khai, bên gửi coi như đã
biết khóa công khai của bên nhận để tùy ý sử
dụng và như vậy mới có thể mã thóa thông
điệp nhằm đảm bảo tính bí mật.
Tương tự như vậy, trường hợp xác
thực sử dụng trung tâm phân phối khóa KDC, mỗi
bên tham gia cũng đã chia sẻ khóa bí mật với KDC.
Tuy nhiên, việc thiết lập và phân phát khóa không phải
vấn đề tầm thường, trong nhiều
trường hợp phân phát khóa qua kênh không bảo
mật có thể nảy sinh vấn
đề và vì vậy cần thiết phải sử
dụng các biện pháp kênh ngoài. Tương tự như
vậy cũng cần phải có biện pháp thu hồi khóa
để ngăn chặn việc sử dụng khóa sau khi
đã bị lộ hoặc không còn hiệu lực.
Khi thiết lập kênh bảo mật,
bên gửi sẽ sử dụng khóa công khai của bên
nhận để khởi tạo kênh truyền, nếu
chấp thuận thì bên nhận sinh khóa phiên sau đó mã hóa
bằng khóa công khai của bên gửi và để trả
về cho bên gửi, bằng cách mã hóa khóa phiên trước
khi gửi lên đường truyền thì có thể yêu tâm
khóa đó sẽ được chuyển an toàn qua mạng.
Dựa vào cách thức trên có thể sinh và phân phát khóa phiên
khi hai bên đã chia sẻ khóa bí mật, tuy nhiên các bên tham gia
đều phải có sẵn phương tiện
để thiết lập kênh truyền bí mật, nghĩa
là phải có một hình thức thiết lập và phân
phối khóa đã được thực hiện, tương
tự như vậy khi thiết lập với bên tin
cậy thứ ba, ví dụ như trung tâm phân phối khóa KDC.

Hình 9.30 Nguyên lý trao đổi khóa Diffie –
Hellman
Giao thức
Diffie-Hellman đã được ứng dụng rộng rãi
để thiết lập khóa chia sẻ qua kênh không an toàn,
giả sử A và B muốn thiết lập khóa bí mật
chia sẻ, cả A lẫn B đều tạo ra hai số
lớn n và g, hai số này có thể được công khai.
Bên A sẽ tạo ra một số lớn khác là x, bên B
tạo ra số lớn y và giữ bí mật chúng, bên A
sẽ gửi cho bên B các số n, g và (gx mod n),
đây đều là những bản rõ vì gần như không
thể tính được x khi chỉ biết giá trị (gx
mod n). Bên B thực hiện tính
(gx mod n)y và về mặt toán học sẽ
bằng (gxy mod n), đồng thời bên B cũng
gửi cho bên A giá trị (gy mod n). Bên A thực
hiện tính toán (gy mod n)x về mặt toán
học cũng bằng (gxy mod n), như vậy
chỉ duy nhất A và B mới biết khóa chia sẻ bí
mật (gxy mod n), bản thân A và B cũng không
cần biết giá trị x và y của nhau. Giao thức
Diffie-Hellman có thể xem như một hệ thống mã hóa
khóa công khai trong đó khóa riêng của A là x và khóa công khai
của A là (gx mod n).
Một trong những khâu phức tạp
trong quản lý khóa là phân phát thực tế các khóa ban
đầu, trong hệ thống mã hóa đối xứng,
khóa bí mật chia sẻ ban đầu phải
được trao đổi theo kênh bảo mật
đảm bảo xác thực cũng như tính bí mật,
nếu không sẵn có khóa nào cho các bên để thiết
lập kênh bảo mật như vậy thì cần phải
phân phát khóa băng ngoài, ví dụ gọi điện
thoại hoặc gửi qua bưu điện.

Hình 9.31 Phân phát khóa bí mật
Trường hợp hệ thống mã
hóa khóa công khai thì cần phân phát khóa công khai sao cho bên
nhận có thể chắc chắn khóa đó là một
cặp với khóa riêng đã yêu cầu, mặc dù không
cần phải mã hóa khóa công khai nhưng nó phải
được chuyển qua kênh xác thực. Trong thực
tế, việc phân phát khóa công khai thực hiện bằng
các phương tiện của chứng chỉ khóa công khai,
chúng gồm khóa công khai kèm theo xâu ký tự xác định
thực thể liên quan tới khóa đó, thực thể có
thể là người sử dụng hoặc thiết
bị mạng. Cả khóa công khai lẫn định danh
đều được ký bởi cơ quan chứng
nhận và chữ ký đó là đúng, định danh của
cơ quan xác nhận đương nhien là một phần
của chứng chỉ. Việc ký thực hiện bằng
khóa riêng K-CA của cơ quan chứng
thực, khóa công khai K+CA coi như
đã biết, ví dụ có thể đăng tải trên các
trang web.

Hình 9.32 Phân phát khóa công khai
Giả
sử khách hàng muốn xác minh khóa công khai trong chứng
chỉ có thực sự thuộc về một thực
thể xác định hay không, họ sẽ sử dụng
khóa công khai của cơ quan xác thực có liên quan để
kiểm tra chữ ký của chứng chỉ, nếu
chữ ký trên chứng chỉ trùng với cặp (khóa công
khai, định danh thực thể) thì có thể chấp
nhận khóa công khai thực sự thuộc về thực
thể xác định và có thể tin tưởng chứng
chỉ không bị giả mạo. Như vậy khách hàng
đã coi khóa công khai K+CA
là của cơ quan chứng
thực có
liên quan, nếu nghi ngờ thì có thể kiểm tra tính
hợp lệ của K+CA
thông qua chứng chỉ khác
từ một cơ quan khác, ví dụ từ cơ quan
chứng thực đáng tin cậy hơn. Mô hình tin cậy
phân cấp trong đó cơ quan chứng thực cấp cao
nhất được mọi người tin tưởng
khá phổ biến, ví dụ thư bảo mật riêng (PEM: Privacy
Enhanced Mail) sử dụng mô hình tin cậy ba mức,
mức thấp nhất do cơ quan chứng thực chính
sách (PCA: Policy Certification Authorities) xác thực, cơ quan này
lại được tổ chức đăng ký chính sách
Internet (IPRA: Internet Policy Registration Authority) xác thực.
Nếu người sử dụng không tin tưởng IPRA
thì cũng không hy vọng người đó sẽ tin
tưởng những thông điệp thư điện
tử gửi qua kênh bảo mật
PEM.
Một trong những vấn đề
quan trọng là tuổi thọ của chứng chỉ, khóa
công khai của chứng
chỉ sẽ luôn hợp lệ cho thực thể xác
định bởi chứng chỉ đó, nếu khóa riêng của
chứng chỉ bị lộ thì không nên sử dụng khóa
công khai đó nữa, như vậy cần phải có cơ
chế công khai tuyên bố chứng chỉ không còn hiệu
lực. Giải pháp phổ biến là công bố danh sách thu
hồi chứng chỉ (CRL: Certificate Revocation List), khách hàng
phải kiểm tra xem chứng chỉ đã bị thu
hồi hay chưa. Nếu danh
sách này công bố hàng ngày thì chứng chỉ bị lộ có
thể được sử dụng cho đến
thời điểm công bố kế tiếp, như
vậy thời gian giữa những lần công bố không
được phép quá dài. Giải pháp thứ hai là giới
hạn thời gian cho mỗi chứng chỉ, quá thời
hạn thì chứng chỉ không còn hiệu lực, trong
thời gian còn hiệu lực thì vẫn có thể
đưa chứng chỉ vào danh sách thu hồi. Giải
pháp thứ ba là giảm thời gian tồn tại có
hiệu lực của một chứng chỉ xuống
gần bằng 0, khi đó máy khách luôn luôn phải kiểm
tra chứng chỉ để xác định thời gian có
hiệu lực của khóa công khai.
Nhiều hệ thống bảo mật
sử dụng các dịch vụ như KDC hoặc CA,
điều đó chứng tỏ vấn đề phức
tạp trong các hệ thống phân tán. Trước hết
những đơn vị cung cấp dịch vụ đó
phải đáng tin cậy, muốn cải thiện tính tin cậy
trong các dịch vụ bảo mật thì phải cung cấp
mức độ cao chống lại tất cả các
hiểm họa bảo mật. Ví dụ, khi CA bị lộ
thì không thể kiểm tra tính hợp lệ của khóa công
khai làm cho toàn bộ hệ thống bảo mật hoàn toàn
không còn giá trị. Mặt khác, các dịch vụ bảo
mật phải có tính sẵn sàng cao, như vậy cần
thiết phải nhân bản, nhưng nhân bản lại làm cho
hệ thống dễ bị tấn công hơn. Vấn
đề cần giải quyết là đảm bảo làm
sao khi một tiến trình yêu cầu tham gia nhóm G thì tính toàn
vẹn của nhóm không bị đe dọa. Giả sử
các thành viên nhóm G sử dụng khóa bí mật CKG
để mã hóa các thông điệp trong nhóm, nhóm còn có thêm
một cặp khóa công khai và
khóa riêng (K+G, K-G) để
giao tiếp với các thành viên của nhóm khác.

Hình 9.33 Qui trình tiếp nhận thành viên
mới
Tiến trình P muốn tham gia vào nhóm G
sẽ gửi yêu cầu tham gia JR, thời gian cục
bộ T của tiến trình P, bản trả lời RP (Reply Pad) và khóa bí mật KP,G, RP và KP,G
được mã hóa cùng nhau
sử dụng khóa công khai K+G của nhóm, JR
được ký bởi tiến trình P và
được gửi đi cùng với chứng
chỉ chứa khóa công khai của P, ký hiệu [M] là thông
điệp M do chủ thể A ký. Khi thành viên Q của nhóm
nhận được yêu cầu tham gia, trước
hết nó xác thực P sau đó sẽ liên lạc với các
thành viên khác của nhóm để xem có nhận P làm thành viên
của nhóm hay không. Việc xác thực P thực hiện
theo cách thông thường bằng chứng chỉ, nhãn
thời gian T dùng để xem chứng chỉ có còn hiệu
lực tại thời điểm gửi yêu cầu hay
không. Thành viên Q kiểm tra chữ ký của cơ quan
chứng thực sau đó tách khóa công khai của P từ
chứng chỉ để kiểm tra tính hợp lệ
của JR, tại thời điểm này tiếp tục
sử dụng giao thức riêng của nhóm để
biết các thành viên khác có đồng ý kết nạp P hay
không.
Nếu tiến trình P được phép
tham gia vào nhms thì Q sẽ trả về thông điệp
tiếp nhận chứa định danh của P và thẻ
của nhóm N, phần RP dùng để mã hóa khóa liên lạc
trong nhóm CKG, khóa riêng của nhóm K-G
được mã hóa bằng khóa CKG. Toàn bộ thông
điệp sẽ được Q ký bằng khóa KP,G,
tiến trình P giờ đây có thể xác thực Q vì
chỉ những thành viên của nhóm mới có thể
nhận ra khóa KP,G, thẻ N trong giao thức không
sử dụng cho việc bảo mật mà P sẽ mã hóa
bằng khóa KP,G và gửi trở lại để
thông báo cho Q biết P đã nhận được tất
cả các khóa cần thiết và đã thực sự tham gia
nhóm. Thay cho việc sử dụng RP, P và Q có thể sử
dụng khóa công khai của P để mã hóa CKG, tuy
nhiên RP chỉ được sử dụng một lần
để mã hóa khóa truyền thông của nhóm trong thông
điệp GA, sử dụng RP sẽ an toàn hơn. Nếu
khóa riêng của P bị lộ thì có thể bị lộ
khóa CKG và như vậy sẽ tổn hại
đến bảm mật truyền thông của nhóm.
Quản lý bảo mật trong hệ
thống phân tán liên quan mật thiết với việc
quản lý quyền truy nhập, vấn đề quyền
truy nhập ban đầu được gán cho
người sử dụng hoặc cho nhóm và cách duy trì chúng
như thế nào vẫn chưa được để
cập tới. Trong hệ thống tập trung việc gán
quyền truy nhập khá đơn giản, mọi công
việc liên quan tới tài khoản đều
được người quản trị hệ thống
xác định trước. Trong hệ thống phân tán,
vấn đề phức tạp hơn vì tài nguyên được
đặt trên nhiều máy, áp dụng như hệ
thống tập trung sẽ phải thiết lập tài
khoản cho mỗi người sử dụng trên từng
máy. Có thể giải quyết vấn đề đơn
giản hơn bằng cách tạo tài khoản trên máy
chủ trung tâm, mỗi lần người sử dụng
truy nhập tài nguyên hệ thống sẽ tham khảo máy
chủ này, về cơ bản phương pháp này giống
như quản lý tài khoản trong hệ điều hành
mạng.
Một cách tiếp
cận tốt hơn đã được áp dụng
rộng rãi trong các hệ thống phân tán là sử dụng
các khả năng, khả năng là một cấu trúc
dữ liệu không thể giả mạo cho một tài
nguyên riêng biệt, nó xác định chính xác quyền truy nhập
của người nắm giữ khả năng đối
với tài nguyên đó. Có thể cài đặt các khả
năng theo nhiều cách khác nhau, ví dụ hệ thống coi
các đối tượng phân tán như những
đối tượng từ xa đặt trên máy chủ,
máy khách truy nhập đến đổi tượng thông
qua tiến trình ủy quyền. Để thực hiện
thao tác trên đối tượng, máy khách chuyển khả
năng vào hệ điều hành cục bộ, hệ
điều hành cục bộ sẽ xác định máy
chủ chứa đối tượng cần truy nhập
và sau đó thực hiện gọi thủ tục từ xa
đến máy chủ đó.
Khả năng là
một định danh 128 bit, với cấu trúc bên trong
gồm bốn trường thống tin, 48 bit đầu
tiên gọi là cổng máy chủ do máy chủ của
đối tượng khởi tạo khi sinh đối
tượng và có tác dụng trong việc tạo ra một
định danh máy tính độc lập cho máy chủ
của đối tượng. 24 bit tiếp theo
được sử dụng để xác định
đối tượng trên máy chủ đã cho, như
vậy kết hợp với phần cổng máy chủ
sẽ tạo ra 72 bit xác định đối
tượng duy nhất trong toàn bộ hệ thống. 8 bit
kế tiếp xác định quyền truy nhập của
chủ thể nắm giữ khả năng, 48 bit cuối
là trường kiểm tra và được dùng để
bảo vệ làm cho khả năng không thể bị sửa
đổi.

Hình 9.34 Cấu trúc định danh
của khả năng
Khi tạo một
đối tượng, máy chủ lấy một
trường kiểm tra ngẫu nhiên và lưu trong khả
năng và nội bộ trong một bảng riêng của nó,
tất cả các bit của trường quyền truy
nhập trong một khả năng mới được
thiết lập bằng 1 và đó là khả năng trả
về cho máy khách. Nếu máy khách yêu cầu thực hiện
một thao thác thì phải gửi trả lại máy
chủ khả năng này, lúc
đó trường kiểm tra sẽ dùng để xác minh xem khả năng
đã cấp có bị sửa đổi hay không. Để
tạo khả năng giới hạn, máy khách có thể
chuyển khả năng ngược trở lại máy
chủ kèm theo mặt nạ bit cho quyền mới, máy
chủ lấy trường kiểm tra gốc từ
bảng của nó và thực hiện phép tính XOR với các
bit của quyền mới và sau đó chạy kết quả
qua hàm một chiều. Máy chủ tạo khả năng
mới với trường đối tượng giữ
nguyên nhưng các bit quyền mới và trường kiểm
tra là kết quả đầu ra của hàm một
chiều, khả năng mới này sẽ được
trả về cho bên gọi và máy khách có thể gửi
khả năng mới này cho tiến trình khác nếu
muốn, ý nghĩa của trường quyền thực
hiện thay đổi theo từng loại đối
tượng.

Hình 9.35 Tạo khả năng hạn
chế từ khả năng của chủ sở hữu
Khi quyền giới hạn quay lại
máy chủ, máy chủ nhìn thấy trường quyền
thực hiện khác với quyền của chủ sở
hữu vì ít nhất một bit đã bị tắt, nghĩa
là giá trị của bit bằng 0, máy chủ lấy số
ngẫu nhiên gốc từ bảng của nó và thực
hiện phép tính XOR với các bit trong trường quyền
thực hiện của khả năng và chạy kết
quả qua hàm một chiều, nếu kết quả
trả về trùng với trường kiểm tra chứng
tỏ khả năng đó là lợp lệ. Như vậy
nếu người sử dụng thêm quyền chưa
được cấp thì chứng chỉ sẽ không
hợp lệ, đảo ngược trường
kiểm tra trong khả năng giới hạn cũng không
thể được vì đã sử dụng hàm một
chiều. Về cơ bản hàm một chiều này cũng
tương tự như tính toán chữ ký số, nếu
thay đổi thông điệp ban đầu thì sẽ
bị phát hiện ngay lập tức.
Một số hệ thống phân tán
sử dụng chứng chỉ thuộc tính, về bản
chất đó là bước tổng quát hóa các khả
năng, không giống như chứng chỉ thông
thường sử dụng khóa công khai để kiểm
tra tính hợp lệ, chứng chỉ thuộc tính sử
dụng danh sách cặp (thuộc tính, giá trị) để
áp dụng cho một thực thể xác định.
Đặc biệt, chứng chỉ thuộc tính có thể
dùng để liệt kê các quyền truy nhập của
chủ thể nắm giữ chứng chỉ đến
một tài nguyên xác định. Tương tự như
chứng chỉ, các chứng chỉ thuộc tính cũng
được chuyển từ những cơ quan chứng
thực cụ thể, các quyền truy nhập liệt kê
trong chứng chỉ sẽ do cơ
quan chứng thực thuộc tính ký.
Ủy nhiệm là
một kỹ thuật quan trọng để bảo
vệ máy tính trong hệ thống phân tán, nó được
thực hiện bằng cách chuyển quyền truy nhập
từ tiến trình này sang tiến trình khác nhằm mục
đích phân tán công việc giữa các tiến trình mà không làm
ảnh hưởng tới việc bảo vệ tài nguyên.
Giả sử người sử dụng A có quyền
đọc tập tin, người sử dụng muốn
in nhưng vì kích thước tập tin quá lớn, đáng
lẽ phải gửi tập tin đến máy in thì
người sử dụng chỉ gửi tên tập tin
để tiến trình trên máy in có thể sao chép vào vùng
đệm của mình. Vấn đề nằm ở
chỗ tiến trình thực hiện in không có quyền truy
nhập đến tập tin trên, vì vậy máy tính của
người sử dụng sẽ từ chối tiến
trình in của máy chủ khi truy nhập đến tập
tin, vấn đề chỉ có thể giải quyết
bằng cách người sử dụng tạm thời
ủy nhiệm quyền truy nhập đến tập tin
cho máy in.
Trong hệ thống
phân tán các tiến trình có thể chạy trên những máy khác
nhau và thậm chí trong những miền quản trị khác
nhau, việc ủy nhiệm có thể tránh được
chi phí cũng như bảo vệ thông thường
được xử lý trên máy cục bộ. Giải pháp
chung cho vấn đề này là sử dụng đại
diện, đó là thẻ cho phép chủ sở hữu
vận hành với những quyền hạn chế mà
chủ thể đã cấp. Tiến trình có thể tạo
đại diện với những quyền giống
như nó đang có, nếu tiến trình tạo một
đại diện mới dựa trên đại diện
hiện hành đang có thì đại diện suy dẫn
cũng sẽ bị hạn chế trong những quyền
của đại diện gốc, thậm chí có thể
bị hạn chế nhiều hơn. Vấn đề này
có thể giải quyết bằng hai cách, nếu A biết
tất cả các thành viên và A muốn ủy nhiệm quyền
đọc cho B thì chỉ cần gửi chứng chỉ [A,B,R]A,
B muốn chuyển quyền này cho C thì chỉ cần yêu
cầu C phải liên hệ với A để nhận
được chứng chỉ thích hợp.

Hình 9.36 Cấu trúc chung của
đại diện dùng để ủy quyền
Cách thứ hai, A
đưa ra chứng chỉ và bất cứ thành viên nào
nắm được chứng chỉ này sẽ có
quyền thực hiện như A đã cấp, như
vậy trường hợp này sẽ phải có biện
pháp chống lại việc sao chép chứng chỉ bất
hợp pháp. Lược đồ Neuman xử lý
trường hợp này, cũng giống như việc
tránh vấn đề mà A cần phải biết tất
cả những thành viên sẽ được ủy
nhiệm. Lược đồ Neuman gồm hai phần,
giả sử A là tiến trình đã tạo ra đại
diện, phần thứ nhất là C=[R,S+Proxy]A
bao gồm R là các quyền truy nhập đã cấp cho A và
phần công khai của bí mật ký hiệu là S+Proxy
được sử dụng để xác thực chủ
nắm giữ chứng chỉ, chứng chỉ mạng
theo chữ ký sig (A, C) của A để bảo vệ
chống lại sửa đổi. Phần thứ hai
chứa phần còn lại của bí mật ký hiệu là S-Proxy
được bảo vệ để chống lại
việc tiếp tục ủy nhiệm cho tiến trình khác.
Nếu A muốn ủy nhiệm cho B một số
quyền nào đó thì tạo danh sách R các quyền mà B có
thể sử dụng, bằng cách ký vào danh sách, A sẽ
ngăn chặn được B giả mạo nó. Tuy nhiên,
chỉ ký thôi thì vẫn chưa đủ, nếu muốn
sử dụng các quyền này thì có thể phải chứng
minh B đã được sự nhận danh sách này từ
A chứ không phải đánh cắp từ một chủ
thể khác. Vì vậy A đặt ra câu hỏi hiểm hóc
mà chỉ có nó mới biết câu trả lời, không
một ai có thể kiểm chứng tính đúng đắn
của câu trả lời đối với câu hỏi
đã cho, câu hỏi này sẽ được thêm vào danh sách
trước khi A thêm chữ ký. Khi ủy nhiệm một
số quyền của mình, A thêm câu hỏi vào danh sách các
quyền và ký trước khi gửi cho B và đồng
thời cung cấp đáp án sao cho không một ai có thể lấy
cắp. Khi truy nhập đến C, C sẽ lấy câu
hỏi từ danh sách để hỏi lại B, nếu B
trả lời đúng chứng tỏ A đã thực
sự ủy nhiệm các quyền trong danh sách cho B. Như
vậy, A không cần phải biết tất cả các thành
viên trong hệ thống, thực tế B có thể
chuyển các quyền trong danh sách cho D, bằng cách
tương tự cũng trao cho D đáp án của câu
hỏi để D có thể chứng minh danh sách đã
được chuyển từ đối tượng có
thẩm quyền. Áp dụng qui trình trên, A và B sử
dụng khóa bí mật KA,B để mã hóa thông
điệp trao đổi với nhau. Đầu tiên A
gửi cho B chứng chỉ C={R,S+Proxy}
ký bằng sig(A,C), ký hiệu là [R,S+Proxy]A,
không cần thiết phải mã hóa thông điệp này,
chỉ có phần riêng của bí mật S-Proxy
mới phải mã hóa bằng khóa KA,B.

Hình 9.37 Chứng minh sở hữu
quyền truy nhập
Giả sử A được ủy
quyền thực hiện một số thao tác trên
đối tượng đặt tại máy chủ và đã ủy nhiệm cho B
những thao tác này, nếu B
muốn thao tác thực hiện trên đối tượng
tại máy chủ thì phải chuyển ủy nhiệm cho
máy chủ dưới dạng chứng chỉ đã ký [R,S+Proxy]A. Nhận được ủy
nhiệm, máy chủ sẽ kiểm tra xem danh sách quyền
thực hiện C có bị làm giả hay không hoặc yêu
cầu B trả lời câu hỏi hiểm hóc. Tuy nhiên máy
chủ vẫn chưa biết B có sở hữu toàn
quyền chứng chỉ hay không, vì vậy phải sử
dụng bí mật đính kèm với C. Máy chủ sử
dụng khóa S+Proxy để mã hóa chuỗi định danh
N và gửi cho B, B sử dụng khoá riêng S-Proxy để
giải mã và gửi lại giá trị N để chứng
minh biết bí mật và nắm toàn quyền của
chứng chỉ.
Để đảm bảo an toàn cho
thông tin trên hệ thống phân tán cần phải xây
dựng các chính sách bảo mật, chính sách bảo mật
cần phải được cụ thể hóa đến
từng đối tượng và các thành phần trong
hệ thống. Chính sách bảo mật máy chủ nhằm
mục đích ngăn chặn truy nhập trái phép
đến các máy chủ trong hệ thống, nội dung
cơ bản của chính sách bảo mật máy chủ bao
gồm chính sách bảo vệ vật lý và bảo vệ
logic, chính sách bảo vệ vật lý bao gồm:
-
Tránh nguy
cơ ảnh hưởng của môi trường:
Để tránh ảnh hưởng của môi trường
đến thiết bị, trung tâm dữ liệu cần có
điều hòa nhiệt độ, điều hòa
độ ẩm. Các tham số về môi trường trong
trung tâm dữ liệu cần được giám sát và
cảnh báo từ xa. Ngoài ra, phòng đặt trung tâm dữ
liệu phải không bị ảnh hưởng của
nhiễu từ trường.
-
Đối
với nguồn cung cấp điện: Để tránh
những nguy cơ về điện làm ảnh
hưởng đến hoạt động của hệ
thống mạng, trung tâm dữ liệu cần
được cung cấp một nguồn điện
ưu tiên đặc biệt hơn các phòng khác. Cần xây
dựng hệ thống điện của công ty đủ
và liên tục để cung cấp nguồn điện cho
các thiết bị. Đối với nguồn điện
cần sử dụng bộ lưu điện, máy phát
điện, nguồn cung cấp dự phòng và nên chú ý vấn
đề cách điện nhằm ngăn chặn cháy
nổ do điện gây ra. Ngoài ra, cần sử dụng
hệ thống cảnh báo, giám sát theo dõi các tham số
nguồn điện từ xa.
-
Đối
với việc bảo trì: Cáp sử dụng phải
được đánh nhãn rõ ràng, cần bảo vệ
tủ thiết bị để tránh đứt kết
nối, lỏng đầu cắm cáp hay cắm sai
cổng, các dây phải được bó gọn. Nên có
một kho chứa các thiết bị dự phòng khi cần,
thoát khỏi giao diện quản trị sau khi thực
hiện xong công việc, bảo vệ truy cập
đến cổng kết nối trực tiếp
đến thiết bị phục vụ cho quản lý, khi
thay thế hay thao tác trực tiếp với các thiết
bị cần chú ý tránh sốc điện làm hỏng
thiết bị.
Chính sách bảo vệ
logic bao gồm:
-
Ghi chép thông
tin cơ bản về máy chủ: Địa điểm
lắp đặt, người chịu trách nhiệm
quản lý trực tiếp, các thông tin về cấu hình và
dịch vụ.
-
Việc thay
đổi cấu hình phải tuân thủ các qui
định đã
được phê duyệt.
-
Loại
bỏ hoặc tạm ngừng các dịch vụ và ứng
dụng không cần thiết.
-
Phải có qui
trình theo dõi hoạt động của máy chủ.
-
Thường
xuyên cập nhật và cài đặt các bản vá lỗi cho
hệ điều hành và các ứng dụng trên máy chủ.
-
Hạn
chế tối đa việc cấu hình tự động
truy nhập hoặc cho phép truy nhập từ hệ
thống khác.
-
Xây dựng
qui trình sao lưu dự phòng dữ liệu.
-
Xây dựng
chính sách truy nhập từ xa đến máy chủ.
-
Xây dựng
qui định về bảo mật tài khoản truy
nhập, qui định cách đặt tên và mật khẩu
cho các tài khoản, thời gian quá hạn cho mỗi tài
khoản.
Ngoài các chính
sách trên, cần phải xây dựng chính sách bảo mật
các máy khách nhằm đảm
bảo an toàn cho thông tin được lưu trữ trên
các máy chủ và thông tin mà các máy khách truy nhập. Phát hiện
đột nhập là khả năng phát hiện, nhận
dạng mã độc tấn công vào mạng hoặc một
máy tính nào đó. Hệ thống phát hiện đột
nhập có khả năng phát hiện các kiểu tấn công
thăm dò, tấn công truy nhập, tấn công từ
chối dịch vụ (DDoS), worms, virus và có thể được
cấu hình để gửi cảnh báo khi phát hiện
những kiểu lưu lượng không rõ ràng. Ngăn
chặn đột nhập là khả năng phát hiện và
ngăn chặn việc thực thi các mã độc tấn
công xâm nhập vào hệ thống, khi phát hiện có xâm
nhập trái phép, một thiết bị cảm ứng
sẽ thực hiện các bước sau:
1. Gửi cảnh báo đến hệ
thống quản lý giám sát
2. Hủy bỏ phiên kết nối
3. Ngay lập tức vứt bỏ gói tin
4. Từ chối các gói tin đến
từ địa chỉ đã tấn công
CHƯƠNG
10:
CÔNG NGHỆ PHÁT
TRIỂN HỆ THỐNG PHÂN TÁN
Hiện nay có nhiều công nghệ hỗ
trợ cho việc phát triển các ứng dụng phân tán.
Tùy theo đặc tính của hệ thống phân tán, chúng ta có
thể lựa chọn các kỹ thuật như gọi thủ
tục từ xa, mô hình
đối tượng thành phần phân tán DCOM của Microsoft,
Java RMI, CORBA và dịch vụ web. Mô hình DCOM của Microsoft cho phép gọi các
đối tượng từ xa và chỉ chạy
được trên nền tảng hệ điều hành
của hãng Microsoft. Java RMI cũng là một kỹ thuật
tốt, dễ dàng cài đặt và triển khai cho các
hệ thống phân tán, tuy nhiên kỹ thuật này chỉ
hỗ trợ ngôn ngữ Java, hiện kỹ thuật này
đã được áp dụng phổ biến trong các
ứng dụng di động. Kiến trúc môi trường
yêu cầu đối tượng chung CORBA hỗ trợ nhiều
ngôn ngữ lập trình, phù hợp cho việc phát triển
các ứng dụng phân tán yêu cầu xử lý theo thời
gian thực. Dịch vụ web có ưu điểm là dễ
phát triển, phù hợp với các ứng dụng trên
mạng Internet, tuy nhiên tốc độ xử lý được
đánh giá là khá chậm, không đáp ứng yêu cầu
thời gian thực. Trong chương này, chúng ta sẽ
tập trung vào ba loại Java RMI, CORBA và dịch cụ web,
đó là những mô hình dựa trên cách tiếp cận
hướng đối tượng phân tán và chúng đang
được ứng dụng rộng rãi để phát
triển các ứng dụng phân tán.
Gọi thủ tục từ xa là phương
thức cho phép thủ tục chạy trên một máy tính có
thể gọi thủ tục chạy trên máy tính khác. Trên
một máy tính, các thủ tục của tiến trình sử
dụng chung một vùng nhớ và việc gọi hàm
tương đối dễ thực hiện. Gọi
thủ tục giữa hai máy tính thông qua kết nối
truyền thông nào đó gọi là gọi hàm từ xa.
Gọi thủ tục từ xa xuất hiện lần
đầu trên các máy tính của Sun Microsystems và Hewlett-Packard
chạy trên nền hệ điều hành UNIX. Các ứng
dụng khách/chủ dùng RPC như một cơ chế
truyền thông liên hệ thống. Gỉả sử
một ứng dụng thuộc mô hình khách/chủ như
một chương trình đã được phân chia, máy
phục vụ chạy phần truy xuất dữ liệu
bởi vì nó lưu trữ dữ liệu và máy khách chạy
phần hiển thị dữ liệu bởi vì nó giao
tiếp với người dùng. Theo sự sắp xếp
này, RPC được xem như là thành phần kết
hợp lại các phần phân chia của chương trình
trên mạng.
Gọi thủ tục từ xa có khuynh
hướng hoạt động theo thời gian thực vì
chương trình gọi thường đợi
đến khi nhận được trả lời từ
chương trình được gọi. RPC được
đòi hỏi trong các ứng dụng mà các thủ tục
không được tiếp tục tới khi nó nhận
được thông tin cần thiết từ hệ
thống ở xa. Một biến tấu là sử dụng
hoạt động đa luồng trong máy gọi thủ
tục để nó có thể tiếp tục với các
hoạt động khác trong khi chờ đợi trả
lời từ máy được gọi. Một trong các
vấn đề khi sử dụng RPC trong môi trường
không đồng là các thiết bị khác nhau biểu
diễn dữ liệu theo cách khác nhau. RPC tránh vấn
đề này bằng cách thêm vào các cuộc gọi thông tin
mô tả cách biểu diễn dữ liệu của bên
gọi. Khi cuộc gọi được nhận, bên
nhận chuyển đổi dữ liệu nếu hai máy
biểu diễn dữ liệu khác nhau. RPC
được thiết kế để cung cấp cho
việc truyền tải thông tin giữa máy khách và máy
chủ dễ dàng hơn, thuận tiện hơn cho
việc đồng bộ hóa các luồn dữ liệu. Các
hàm chứa trong RPC hỗ trợ cho việc truy cập
bất kỳ chương trình nào đòi hỏi
phương pháp giao tiếp từ máy khách đến máy
chủ. Các thành phần của RPC bao gồm:
-
Tiến
trình khách/chủ:
Chương trình trên máy khách để gọi thủ
tục từ xa hoặc dịch vụ trên máy chủ
trả lời yêu cầu gọi thủ tục từ xa
của máy khách.
-
Stub/Skeleton: Những chương trình con
được máy khách/máy chủ sử dụng để khởi
động yêu cầu gọi thủ tục từ xa. Máy
khách sử dụng Stub để đóng gói các tham số và
tên thủ tục thành những thông điệp gửi sang
máy chủ, Skeleton trên máy chủ sẽ bóc tách thông tin từ
thông điệp máy khách chuyển sang và gọi thủ
tục cục bộ trên máy chủ sau đó lại đóng
gói kết quả trả về để chuyển cho
tiến trình trên máy khách.
-
Thủ
tục sắp xếp NDR20 hoặc NDR64: Cung cấp một giao diện
chung gọi thủ tục từ xa giữa máy khách và máy
chủ và, giao diện NDR20 hay NDR64. NDR20 được dùng
cho hệ thống 32 bit, trong khi đó NDR64 được
tối ưu dùng cho hệ thống 64 bit. Máy khách và máy
chủ sẽ thương lượng chọn NDR20 hay NRD64
để giao tiếp với nhau
-
Giao
diện lập trình ứng dụng (API): Cung cấp giao diện gọi
thủ tục từ xa cho máy khách và máy chủ. Thông
thường, máy khách và máy chủ sẽ gọi hàm giao
diện lập trình ứng dụng API để khởi
tạo và chuẩn bị cấu trúc dữ liệu sẽ
được sử dụng để thực hiện
cuộc gọi thủ tục từ xa. Giao diện API
sẽ quyết định yêu cầu gọi thủ
tục từ xa đến từ thủ tục sắp
xếp hoặc trực tiếp từ máy khách đến
máy chủ nội bộ hoặc máy chủ từ xa, sau
đó giao diện API sẽ dẫn đường cho liên
kết gọi thủ tục từ xa.
-
Giao
thức gọi thủ tục từ xa có liên kết: Được sử dụng
khi việc gọi thủ tục từ xa yêu cầu giao
thức liên kết, nó sẽ chỉ định sử
dụng giao thức kết nối có liên kết trong
việc gửi yêu cầu hoặc nhận kết quả
trả về.
-
Giao
thức gọi thủ tục từ xa không liên kết: Được sử dụng
khi việc gọi thủ tục từ xa yêu cầu giao
thức không liên kết, nó chỉ định sử
dụng giao thức không liên kết trong việc gửi yêu
cầu hoặc nhận kết quả trả về.
-
Giao
thức gọi thủ tục từ xa cục bộ: Được sử dụng
khi tiến trình gọi và tiến trình cung cấp dịch
vụ gọi thủ tục từ xa đều trong cùng
một máy.
-
Thành
phần đăng ký: Được truy nhập khi dịch vụ gọi
thủ tục từ xa đầu tiên được
tải về. Các thành phần trong đăng ký sẽ
chỉ định chuỗi cổng và địa chỉ,
tên thiết bị của các card mạng để gọi
thủ tục từ xa có thể kết hợp chúng
lại với nhau. Thành phần đăng ký sẽ không
được sử dụng trừ khi giao diện API ép
buộc việc gọi thủ tục từ xa phải sử
dụng.
-
Các
thư viện liên kết động kernel32.dll, advapi32.dll,
ntdll.dll, secur32.dll, rpcss.dll: Kernel32.dll là tập
tin thư viện liên kết động 32 bit có trong các
hệ điều hành của hãng Microsoft, nó chịu trách
nhiệm quản lý bộ nhớ, các hoạt động
vào ra của hệ thống. Advapi32.dll là tập tin nâng cấp
của các hệ điều hành Windows 32 bit dựa trên giao
diện lập trình ứng dụng, nó hỗ trợ về
bảo mật và gọi các thành phần đăng ký.
Ntdll.dll là tập tin thư viện liên kết động
quản lý chức năng các tập tin hệ thống của hệ
điều hành Windows. Tập tin thư viện liên kết
động secur32.dll cung
cấp giao diện bảo mật cho gọi thủ tục
từ xa, nó thương lượng cách dùng cho việc
chứng thực và mã hóa như Kerberos, NTLM hoặc SSL.
Rpcss.dll chủ yếu cung cấp hạ tầng cho các
dịch vụ mô hình đối tượng thành phần,
nhưng một phần của Rpcss.dll được dùng
cho điểm kết thúc động và đăng ký những
điểm này vào cơ sở dữ liệu EPM. Khi máy khách
muốn kết nối tới thủ tục từ xa trên
máy chủ, nó sẽ liên lạc với EPM để phân
giải những điểm kết thúc.
-
Thư
mục hoạt động: Chỉ được sử dụng cho quá trình
xử lý gọi thủ tục từ xa máy khách khi giao
diện bảo mật cụ thể như Kerberos hoặc NTLM
như nhà cung cấp bảo mật.
-
Ngăn
xếp mạng và lõi: Được sử dụng thông qua các yêu
cầu và trả lời của gọi thủ tục
từ xa giữa máy khách và máy chủ.
Các thành phần của gọi
thủ tục từ xa sẽ giúp cho các máy khách xử lý
dễ dàng bằng cách gọi hàm nằm trên một
chương trình ở xa. Máy khách và máy chủ có không gian
địa chỉ riêng, nghĩa là mỗi nguồn tài nguyên
bộ nhớ của máy khách và máy chủ cấp phát cho
dữ liệu sẽ được các hàm trên máy cục
bộ sử dụng. Quá trình xử lý gọi thủ
tục từ xa bắt đầu từ phía máy khách, tiến
trình khách sẽ gọi stub thay vì phải viết đoạn
mã triển khai cho hàm đó, các stub sẽ được
biên soạn và liên kết với các ứng dụng khách
trong quá trình phát triển. Thay vì chứa mã đoạn mã
để thực hiện thủ tục gọi hàm từ
xa, các đoạn mã của stub sẽ yêu cầu truy vấn
những tham số từ không gian địa chỉ
của máy khách và sau đó chuyển chúng vào thư viện
chạy thực trên máy khách, thư viện chạy thực
của máy khách sẽ biên dịch những tham số
cần thiết vào định dạng chuẩn NDR để chuyển sang máy
chủ.
Tiếp theo, stub sẽ gọi
hàm trong thư viện chạy thực của máy khách rpcrt4.dll
để gửi các yêu cầu và tham số của nó
đến tiến trình chủ. Nếu tiến trình khách và
tiến trình chủ đều chạy trên cùng một máy,
thư viện chạy thực có thể sử dụng các
tính năng của LRPC và thông qua các yêu cầu của gọi
thủ tục từ xa tới phần lõi của hệ
điều hành để chuyển đến tiến trình
chủ. Nếu tiến trình chủ đặt trên máy khác,
thư viện chạy thực sẽ xác định
một giao thức truyền tải thích hợp và thông qua
các yêu cầu của gọi từ xa đến ngăn
xếp mạng cho việc truyền tải đến
tiến trình chủ. Gọi thủ tục từ xa có
thể dùng các cơ chế trao đổi khác như cơ
chế đường ống hoặc socket để
thực hiện truyền tải đến tiến trình chủ.
Khi nhận được yêu cầu gọi thủ tục
từ xa, các hàm trong thư viện chạy thực trên máy
chủ tiếp nhận các yêu cầu và gọi hàm xử lý Skeleton, Skeleton sẽ truy vấn
các tham số từ vùng đệm mạng và chọn NDR32
hoặc NDR64 sau đó chuyển đổi chúng từ
định dạng truyền tải mạng sang
định dạng theo yêu cầu của tiến trình chủ, nghĩa là chuyển từ
dạng thông điệp thành tên thủ tục và giá trị
cảu các tham số. Sau đó các thủ tục từ xa
sẽ được chạy, khi kết thúc, chuỗi các
bước tương tự sẽ trả về dữ
liệu cho máy khách.
Các thủ tục từ xa
trả dữ liệu của nó về cho Skeleton, sử
dụng NDR32 hoặc NDR64 để chuyển đổi
những tham số được xuất ra thành định
dạng truyền tải mạng đến máy khách và
trả chúng vào thư việc chạy thực của máy
chủ. Sau đó thư viện chạy thực của máy
chủ sẽ truyền tải dữ liệu đến
máy tính của Máy khách bằng LRPC hoặc qua mạng.
Tiến trình khách hoàn tất các thủ tục bằng cách
tiếp nhận dữ liệu qua mạng và trả dữ
liệu về để gọi hàm, thư viện chạy
thực của máy khách nhận được giá trị trả
về của thủ tục
từ xa, chuyển đổi giá trị từ NDR32
hoặc NDR64 về định dạng theo yêu cầu
của máy khách và trả về stub, stub sẽ bóc tách các tham
số trong giá trị trả về để chuyển cho
thủ tục đã gọi. Đối với hệ
điều hành Windows của Microsoft, thư viện
chạy thực gồm các thư viện liên kết
ứng dụng và các thư viện liên kết động
trong thời gian chạy.
Để các đối tượng có thể
liên lạc với nhau trong môi trường mạng, ActiveX
sử dụng mô hình đối tượng thành phần
phân tán DCOM, các đặc điểm cơ bản của
mô hình DCOM bao gồm:
-
Cung cấp
các dịch vụ cho ActiveX và OLE.
-
Hỗ
trợ các giao diện API để gọi các đối
tượng động và tĩnh.
-
Các đối
tượng tương tác với nhau bằng cách sử
dụng cơ chế gọi thủ tục từ xa RPC
trong môi trường tính toán phân tán.
Ban đầu Microsoft phát triển mô hình
đối tượng thành phần COM (Component Object Model),
đó là một thành phần kiến trúc cơ bản
của OLE để xác định giao diện gữa các
đối tượng thành phần. Mô hình đối
tượng thành phần phân tán DCOM (Distributed Component Object
Model) là mô hình mở rộng của COM nhằm hỗ
trợ truyền thông giữa các đối tượng
trên nhiều máy khác nhau qua mạng máy tính.
DCOM là một mô hình nhằm hỗ
trợ việc xây dựng các ứng dụng phân tán trên cơ sở mô hình đối
tượng, với việc dùng các phần mềm trung gian.
Với tiêu chí đó, DCOM được thiết kế có
các đặc trưng cơ bản như sau:
-
Độc
lập vị trí (Location independence)
-
Độc
lập ngôn ngữ (Language neutrality)
-
Quản lý kết nối (Connection management
-
Khả năng thay đổi quy mô
(Scalability)
-
Hiệu
năng (Performance)
-
Bảo
mật (Security)
-
Cân bằng
tải (Load balancing)
-
Tính chịu
lỗi (Fault tolerance)
DCOM là mô hình phát triển kế tiếp của COM, nó
xác định phương thức kết nối của
các thành phần với các tiến trình trên máy khách, sự
tương tác này có thể thực hiện trực
tiếp mà không cần thành phần trung gian. DCOM có một
số ưu điểm sau:
-
Hỗ
trợ các giao diện ngôn ngữ hướng đối
tượng
-
DCOM sẵn có
trong các hệ điều hành Windows
-
Có khả
năng giao tiếp dễ dàng với DCE.
-
Các mạng
tương thích với DCOM có giá thành thấp
-
Có sự phân
biệt rõ ràng của các giao diện và cài đặt
Cài đặt DCOM lại phụ
thuộc nền tảng hệ thống (phần cứng, hệ
điều hành), các đối tượng và các giao
diện được lập trình phức tạp, không
trực quan.
Kiến trúc môi trường yêu cầu
đối tượng chung CORBA (Common object request broker
architecture) do nhóm quản lý đối tượng OMG
đưa ra từ năm 1990. OMG cung cấp các sườn
kiến trúc chung cho lập trình hướng đối
tượng, trong đó mô tả rõ các kiến trúc quản
lý đối tượng bao gồm: các chức năng môi
trường yêu câu đối tượng ORB, các dịch
vụ đối tượng, các phạm vi giao diện,
các đối tượng ứng dụng. CORBA
được xây dựng và phát triển dựa trên các
đặc tả trên nhằm mục đích chuẩn hoá
việc xây dựng các ứng dụng phân tán. Trong CORBA các
đối tượng phân tán được định
nghĩa để có thể lưu giữ và gọi từ
xa, do đó nó phải đảm bảo tất cả các
nhiệm vụ chung liên quan tới việc lập trình trên
mạng bao gồm việc đăng ký đối
tượng, gửi/nhận yêu cầu
trên mạng...
CORBA bao
gồm các tiêu chuẩn hỗ trợ việc phát triển
các ứng dụng theo mô hình hướng đối
tượng, trong đó các đối tượng có
thể thực hiện trên một bộ xử lý hoặc
được phân tán trên mạng. Để đạt
được mục tiêu tích hợp các hệ thống
của các nhà cung cấp khác
nhau, kiến trúc CORBA đảm bảo ba đặc điểm
quan trọng sau:
-
Không phụ
thuộc hệ điều hành và thiết bị phần
cứng
-
Không phụ
thuộc ngôn ngữ lập trình
-
Không phụ
thuộc vị trí vật lý cài đặt các ứng
dụng
Hình 10.1 Các thành phần cơ bản trong
CORBA
Các đối tượng trong CORBA
được thể hiện và cài đặt tương
tự như các lớp trong ngôn ngữ lập trình
hướng đối tượng do đó có tính
tương thích cao và hoàn toàn độc lập với
hệ điều hành. Nhằm mục đích chuẩn hoá
kiến trúc này, nhóm OMG đưa ra các đặc tả giao diện, hình 10.1 thể
hiện các thành phần cơ bản trong kiến trúc CORBA. Thành
phần cơ bản trong kiến trúc CORBA là môi
trường yêu cầu đối tượng ORB, nó cung
cấp các giao diện, dịch vụ và các phương
tiện phục vụ cho các đối tượng CORBA.
Khi ORB nhận được yêu cầu của máy khách nó
chuyển yêu cầu đó đến máy chủ thích
hợp. Theo cách lập trình khách/chủ truyền thống, máy
khách phải biết tên và vị trí của máy chủ,
phương pháp thiết lập và duy trì kênh liên lạc,
phương pháp gửi/nhận các tham số. Trong CORBA, máy khách
chỉ cần biết tên của thủ tục cần
gọi và các tham số cần thiết để
gửi/nhận, mọi thao tác khác do các thành phần của
CORBA đảm nhiệm.
-
Các dịch
vụ đối tượng: là các giao diện không phụ thuộc giao diện
vùng để các đối tượng phân tán sử
dụng, ví dụ dịch vụ xác định tên
đối tượng, dịch vụ bảo mật...,
các dịch vụ này được cài đặt
độc lập với ORB.
-
Các
phương tiện chung: là
các phương tiện dùng cho tất cả các loại
ứng dụng trên cho sản phẩm của các hãng khác
nhau.
-
Giao
diện vùng: thực
hiện vai trò tương tự như các dịch vụ
đối tượng và các phương tiện chung
nhưng tập trung vào các lĩnh vực ứng dụng
riêng, ví dụ CORBA cho viễn thông, CORBA cho tài chính, ngân
hàng...
-
Các giao
diện ứng dụng: là
các giao diện riêng cho các ứng dụng đã xác
định, giao diện này chưa được chuẩn
hoá
Hình 10.2 Quá trình thực hiện yêu
cầu của máy khách
Môi trường ORB là
thành phần cơ bản trong CORBA, đó là phần mềm
nằm giữa lớp ứng dụng và lớp giao vận.
Bản thân ORB không thuộc thành phần của hệ
điều hành mà là một
dạng phần mềm trung gian dưới sự kiểm
soát của hệ điều hành. Môi trường ORB
đảm nhiệm các công việc sau:
-
Sẵn sàng
nhận các yêu cầu
của máy khách
-
Cung cấp
tất cả các thủ tục cần thiết để
tìm ra đối tượng
thực hiện yêu cầu của máy khách
-
Trao
đổi dữ liệu và gửi yêu cầu đến thành
phần cung cấp dịch vụ Servant
-
Cung cấp
một số dịch vụ khi Servant yêu cầu trong
thời gian thực hiện
Ứng dụng máy khách
chỉ cần liên hệ với giao diện giao diện
hoàn toàn độc lập với vị trí cài đặt
đối tượng thực hiện.
-
Máy khách: là
đối tượng yêu cầu dịch vụ.
-
Servant: là các
đối tượng phục vụ yêu cầu của các
máy khách, nó định nghĩa các thao tác, hỗ trợ giao
diện IDL của CORBA.
-
ORB: là môi
trường trung gian thiết lập quan hệ khách/chủ
giữa các đối tượng. bằng cách sử
dụng ORB, đối tượng máy khách có thể
gọi các hàm trên máy cục bộ hoặc trên mạng.
-
Giao diện
với môi trường ORB:
Cung cấp các giao diện để máy khách và Servant
kết nối với nhau qua môi trường ORB.
-
Stub và Skeleton
của ngôn ngữ IDL: Stub gồm các lệnh cho phép máy khách
truy nhập tới các thành phần của máy chủ
tương tự như cơ chế gọi gọi
thủ tục từ xa. Skeleton gồm các lệnh trên máy
chủ để liên lạc với các thành phần CORBA, nó
đóng vai trò cầu nối giữa ORB với đối
tượng thực hiện trên máy chủ.
-
Thành phần
tích hợp BOA hoặc POA: Hỗ trợ ORB trong việc phân
phát các yêu cầu đến các đối tượng
thực hiện.

Hình 10.3 Cấu trúc và giao
diện của ORB
Khi có yêu cầu, máy khách
sử dụng giao diện gọi đối tượng
động DII hoặc sử
dụng Stub của ngôn ngữ định nghĩa giao
diện IDL, đối với một số chức
năng máy khách có thể trực tiếp
tương tác với môi trường ORB. Môi trường ORB chuyển yêu
cầu của máy khách
đến đối tượng phục vụ Servant
thông qua IDL Skeleton tĩnh hoặc Skeleton động. Có hai
phương pháp định nghĩa giao diện:
phương pháp tĩnh và phương pháp động. Theo
phương pháp thứ nhất, giao diện
được định nghĩa trong ngôn ngữ IDL
để qui định các loại đối
tượng và các thao tác trên đối tượng.
Phương pháp thứ hai sử dụng dịch vụ kho
lưu trữ giao diện để thể hiện các thành
phần của giao diện như các đối
tượng phục vụ và cho phép truy nhập các thành
phần này trong thời gian chạy. Đối với môi
trường ORB thì phương pháp sử dụng ngôn
ngữ IDL hay sử dụng dịch vụ kho giao diện
đều có ý nghĩa như nhau.
Ứng dụng máy khách khởi
tạo yêu cầu bằng cách gọi các thủ tục trong Stub liên quan đến
đối tượng hoặc bằng cách tạo yêu
cầu theo phương pháp động. Môi trường ORB
xác định mã thực hiện thích hợp, chuyển các
tham số và chuyển quyền điều khiển cho
đối tượng phục vụ Servant thông qua Skeleton
của ngôn ngữ IDL hoặc qua Skeleton động. Trong quá
trình thực hiện đối tượng Servant có
thể sử dụng một số dịch vụ của
môi trường ORB thông qua thành phần thính nghi đối
tượng. Khi thực hiện xong yêu cầu, quyền
điều khiển và các giá trị trả về sẽ
được chuyển cho ứng dụng máy khách.
Việc cài đặt
môi trường ORB phải dựa trên các yêu cầu của
hệ thống phân tán, đối với các hệ
thống hạn chế về mặt tài nguyên nên cài
đặt ORB tối thiểu và các ứng dụng phân tán
sử dụng phương pháp tĩnh. Nếu có môi trường truyền thông
thích hợp thì có thể cài đặt môi trường ORB
thường trú trong ứng dụng máy khách và trong
đối tượng phục vụ Servant. Stub có thể
sử dụng cơ chế trao đổi thông tin liên
tiến trình hoặc sử dụng dịch vụ xác
định vị trí để thiết lập thông tin
với đối tượng thực hiện trên máy
chủ. Môi trường ORB có thể là chương trình
bình thường cài đặt trên máy máy chủ giống
như hệ điều hành đang sử dụng, liên
lạc với máy khách và Servant vẫn được
đảm bảo thông qua cơ chế trao đổi thông
tin liên tiến trình. Để bảo đảm tính
bảo mật, khả năng mở rộng và hiệu
suất hoạt động của hệ thống, có
thể cài đặt môi trường ORB như một
dịch vụ của hệ điều hành đang sử
dụng.
Theo kiến trúc của CORBA, ứng
dụng máy khách sử dụng tham chiếu đối
tượng để gọi các hàm do đối
tượng cung cấp. Để gọi một
đối tượng cần phải tiến hành các
bước như: xác định đối tượng
sẽ gọi, hàm thực hiện và các tham số cung cấp cho hàm cũng
như giá trị trả về của nó. Môi trường
ORB quản lý các quá trình chuyển quyền điều
khiển và chuyển dữ liệu giữa đối
tượng thực hiện và ứng dụng Máy trạm,
ứng dụng Máy trạm gọi các hàm của đối
tượng phục vụ tương tự như
gọi các hàm trên máy cục bộ.
Đối tượng thực hiện
là các đối tượng
bao hàm cả dữ liệu và các thao thác thực hiện
trên dữ liệu, theo cách hiểu trong lập trình
hướng đối tượng đây là các thể
hiện của đối tượng. Chức năng
thực hiện của đối tượng này hoàn toàn
độc lập với môi trường ORB, môi
trường này chỉ đảm nhiệm liên kết
giữa máy khách và đối tượng thực hiện.
Tham chiếu đối tượng là thao tác nhận thông
tin cần thiết dụng để xác định
một đối tượng thực hiện trong môi
trường ORB, tương tự như mô hình lập
trình trên một máy tính, có thể hình dung thao tác này
tương tự như thao
tác lấy địa chỉ của đối
tượng phục vụ. Để gọi các thao tác trên
đối tượng phục vụ, máy khách phải
nhận được tham chiếu đối
tượng do môi trường ORB cung cấp. Môi
trường ORB sử dụng phương pháp ánh xạ như
nhau đối với tất cả các ngôn ngữ lập
trình, vì vậy ứng dụng viết trên các ngôn ngữ
khác nhau hoàn toàn có thể giao tiếp với nhau trong môi
trường ORB của kiến trúc CORBA. Các yêu cầu cài
đặt nói chung phụ thuộc nhiều vào ba yếu
tố: thiết bị phần cứng, hệ điều
hành và ngôn ngữ lập trình sử dụng để
viết mã lệnh. Thành phần tích hợp đối
tượng là phương tiện chủ yếu
để Servant truy nhập các dịch vụ của ORB, nó
đảm nhiệm các chức năng sau:
-
Tạo và biên
dịch tham chiếu đối tượng
-
Gọi các hàm
của đối tượng phục vụ
-
Bảo
mật các tương tác giữa ứng dụng máy khách và
các ứng dụng phục vụ
-
Kích hoạt
và huỷ các đối tượng thực hiện
-
Ánh xạ tham
thiếu đối tượng máy khách với các
đối tượng phục vụ tương ứng
-
Đăng ký
việc cài đặt đối tượng phục
vụ
Trong hệ thống có thể tồn
tại nhiều thành phần thích nghi đối
tượng và nó chỉ thích hợp cho một số
loại đối tượng riêng. Thành phần tích hợp đối
tượng cơ bản BOA
được định nghĩa trong phiên bản CORBA
1.0 với mục tiêu
đơn giản và đáp ứng các mục đích cơ
bản để tích hợp
đối tượng, do đó nó chỉ bao hàm các thao tác
chính và được thể hiện trên hình 10.4 viết
bằng ngôn ngữ IDL. Thành
phần tích hợp đối tượng cơ
bản định nghĩa ba
trạng thái mà đối tượng có thể nhận
được:
-
Trạng thái
không tồn tại: đối tượng không tồn
tại, môi trường ORB không xác định
được đối tượng, vì vậy khi có yêu
cầu gọi môi trường ORB sẽ từ chối
phục vụ và gửi kèm theo thông báo lỗi.
-
Trạng thái
tồn tại: Đối tượng đã
được tạo ra và môi trường ORB nhận
biết được đối tượng, tuy nhiên
đối tượng có thể ở hai trạng thái sau:
o
Trạng thái
không hoạt động: ứng dụng máy khách có thể
nhận được tham chiếu đến đối
tượng nhưng không thể thực gọi các thao tác
thực hiện trên đối tượng.
o
Trạng thái
hoạt động (active): ứng dụng Máy trạm có
thể sử dụng tất cả các dịch vụ do
đối tượng cung cấp.

Hình 10.4 Đặc tả thành phần
tích hợp đối tượng cơ bản
Sự thay đổi trạng thái
của các đối tượng được thực
hiện trên máy chủ, hình 10.5 thể hiện chu kỳ
sống của đối tượng và các hàm làm thay
đổi trạng thái của nó. Thành phần tich hợp
đối tượng động POA là thành phần trung
gian giữa cài đặt đối tượng và môi
trường ORB, nó được thiết kế không
những để thay thế BOA mà còn đảm bảo
hai đặc tính quan trọng sau:
-
Khả
năng dễ dàng chuyển đổi: Cho phép các ứng
dụng chạy trên các môi trường ORB khác nhau mà không
cần thay đổi mã nguồn.
-
Tính linh
hoạt: Cho phép kiểm soát chu kỳ sống và tính sẵn
sàng của đối tượng phục vụ trong
việc nhận các yêu cầu từ phía máy khách.

Hình 10.5 Chu kỳ sống của
đối tượng sử dụng BOA
Mục
tiêu của thành phần tích hợp POA bao gồm:
-
Cho phép
lập trình viên xây dựng cài đặt đối
tượng dễ dàng chuyển đổi giữa các
sản phẩm ORB khác nhau.
-
Cho phép cài
đặt đối tượng để cung cấp
dịch vụ cho các đối tượng mà thời gian
tồn tại của nó vượt quá thời gian phục
vụ.
-
Hỗ
trợ việc kích hoạt trong suốt các đối
tượng.
-
Cho phép một Servant đồng
thời hỗ trợ nhiều Object ID.
Hình 10.6 Kiến trúc của thành phần
tích hợp động POA
Như vậy, trên đối
tượng phục vụ có thể tồn tại
nhiều POA, chúng được tổ chức theo phân
cấp trong đó Root POA do môi trường ORB tạo ra, các
POA khác do người sử dụng tạo lập và là các
POA con. Hình 10.6 thể hiện kiến trúc và tương tác
giữa các thành phần khác nhau của POA, chức năng
của mỗi thành phần như sau:
-
Servant là các mã
lệnh thể hiện các đối tượng phục
vụ và được cài đặt trong các mô đun cung
cấp dịch vụ.
-
Object ID là giá
trị do POA sử dụng để xác định
một đối tượng CORBA, các giá trị này do POA
quản lý.
-
Tham chiếu
đối tượng là thao tác trong mô hình đối
tượng CORBA nhằm mục đích nhận tên của
POA và Object ID, để đơn giản có thể
hiểu thao tác này tương tự như việc lấy
địa chỉ của một đối tượng.
-
Chương
trình quản lý POA là đối tượng phục vụ
cho việc quản lý trạng thái xử lý của POA,
bằng cách sử dụng các
thao tác của chương trình quản lý này có thể
thực hiện việc huỷ bỏ hoặc đưa
vào hàng đợi các yêu cầu liên quan với POA. Thông qua
chương trình quản lý POA, lập trình viên có thể
đưa POA về trạng thái không hoạt động.
-
Chương trình quản lý Servant là
một đối tượng mà người phát triển
ứng dụng có thể gán với chương trình
quản lý POA, môi trường ORB gọi các thao tác trên
chương trình quản lý Servant để kích hoạt
Servant theo yêu cầu hoặc đưa Servant về
trạng thái không hoạt động. Chương trình
quản lý Servant có nhiệm vụ quản lý mối liên
kết đối
tượng đặc trưng bằng giá trị của
Object ID với Servant tương ứng và quyết đinh
sự tồn tại của đối tượng.
-
Kích hoạt bộ tích hợp là
đối tượng mà người phát triển ứng
dụng có thể gán với POA, ORB gọi thao tác trên thành
phần này khi có yêu cầu đối với POA con nhưng
POA con đó không tồn tại, nó có thể tạo POA
cần thiết theo yêu cầu.
-
Chương
trình quản lý đối tượng phục vụ có
thể điều khiển và giám sát chu kỳ sống
của các đối tượng phục vụ.
-
Một đối
tượng phục vụ mặc định có thể
đồng thời phục vụ nhiều đối
tượng
-
Trong
trường hợp cần thiết, có thể sử
dụng thành phần kích hoạt đối tượng
tích hợp để tạo POA mới.
-
Chính sách
về luồng xử lý: Qui định POA sử dụng
trong môi trường đa luồng hay đơn luồng.
Trong chế độ đa luồng POA xử lý
đồng thời nhiều yêu cầu, trong chế
độ đơn luồng các yêu cầu lần
lượt được POA xử lý.
-
Chính sách
về phạm vi tồn tại: thuộc tính này có thể
nhận giá trị TRANSIENT hoặc PERSISTENT. Khi có yêu cầu
từ phía máy khách, nếu POA ở trạng thái không kích
hoạt và POA được đặt thuộc tính
TRANSIENT thì sẽ trả
về lỗi OBJECT_NOT_EXIST, trường hợp POA có
thuộc tính PERSISTENT thì môi trường ORB sẽ tìm kiếm POA dựa trên tên và các
POA cha hoặc thông báo cho dịch vụ định vị
để tạo hoặc xoá bỏ POA.
-
Chính sách
về tính duy nhất của tên định danh đối
tượng: Qui định một đối tượng
phục vụ có thể đăng ký với POA theo một
hoặc nhiều tên định danh
-
Chính sách gán
định danh: Qui định việc đặt
định danh cho đối tượng phục vụ do
POA hay do người sử dụng quyết định.
Khi kích hoạt một đối tượng, định
danh và đối tượng phục vụ tương
ứng của nó thường được lưu trong
bản đồ đối tượng hoạt
động.
-
Chính sách duy trì
đối tượng phục vụ: Qui định
đối tượng phục vụ đã kích hoạt có
được đăng ký trong bản đồ
đối tượng hoạt động hay không.
-
Chính sách
về xử lý yêu cầu: Qui định phương pháp
xử lý khi nhận được yêu cầu từ phía máy
khách theo một trong ba cách sau:
o
POA tìm kiếm
đối tượng phục vụ yêu cầu trong
bản đồ đối tượng kích hoạt.
o
Chuyển yêu
cầu đến chương trình quản lý đối
tượng phục vụ .
o
Sử
dụng đối tượng phục vụ mặc
định.
-
Chính sách kích
hoạt ngầm định: Một số thao tác trên
đối tượng phục vụ đòi hỏi
đối tượng này phải ở trạng thái
hoạt động, ví dụ thao tác nhận tham chiếu
đối tượng, nếu thiết lập chính sách
kích hoạt ngầm định sẽ loại bỏ thông
báo lỗi trong các trường hợp trên.

Hình 10.7 Sơ đồ chuyển
trạng thái của POA
Các chính sách của POA có mối liên hệ với nhau,
việc đặt giá trị cho chính sách này có thể
ảnh hưởng tới việc thiết lập các chính
sách khác. Thành phần tích hợp
đối tượng cơ bản BOA không có cơ
chế đồng bộ các đối tượng
phục vụ và không có khả năng kiểm soát tính
sẵn sàng tiếp nhận các yêu cầu, nhược
điểm này đã được POA khắc phục
bằng cách đưa ra chương trình quản lý POA.
Thực chất chương trình quản lý kiểm soát các
trạng thái và các vấn đề liên quan đến
việc chuyển trạng thái của POA, hình 10.7 thể hiện các
trạng thái của POA và các bước chuyển trạng
thái của chúng.
-
Trạng thái
hoạt động: Các yêu cầu từ phía Máy trạm
sẽ được chuyển đến đối
tượng phục vụ tương ứng để
xử lý.
-
Trạng thái
chờ: Các yêu cầu không được xử lý ngay mà
chuyển đến hàng đợi để chờ
xử lý
-
Trạng thái
từ chối: Các yêu cầu
đều bị từ chối phục vụ và ứng dụng Máy trạm
nhận được mã lỗi TRANSIENT báo hiệu đã
xảy ra sự cố tạm thời
-
Trạng thái
không hoạt hoạt động: Tất cả các yêu
cầu đều bị từ chối phục vụ.
Thao tác thiết lập POA và gán các
đối tượng phục vụ được
thực hiện theo các bước sau:
-
Nhận tham
chiếu đến root POA: Tất cả các ứng
dụng máy chủ phải nhận tham chiếu đến
rootPOA để phục vụ cho việc quản lý các
đối tượng hoặc tạo các POA mới, RootPOA
do môi trường ORB quản lý và được khởi
tạo bằng cách tạo đối tượng có tên là
rootPOA.
-
Định
nghĩa các chính sách cho POA: Qui định các chính sách cụ
thể đối với POA phục vụ cho các yêu
cầu riêng, nếu không thiết lập các tham số chính
sách thì POA sẽ nhận các tham số mặc định.
-
Tạo POA con
của root POA: Trong một ứng dụng không hạn
chế số lượng POA, tuy nhiên POA con không kế
thừa các chính sách của POA cha.
-
Tạo và kích
hoạt đối tượng phục vụ: Mã lệnh
thực hiện của đối tượng phục
vụ phải được cài đặt trên máy chủ,
để máy khách sử dụng các dịch vụ cần
phải kích hoạt Servant bằng cách đăng ký
định danh của đối tượng phục
vụ trong bản đồ đối tượng
hoạt động, thực chất đó là bảng dùng
để ánh xạ tên định danh với đối
tượng phục vụ tương ứng.
Hình 10.8 Các dịch vụ và các
phương tiện của CORBA
Bình thường khi POA mới
được tạo lập, trình quản lý POA ở
trạng thái chờ, trong trạng thái này tất cả các
yêu cầu đều được chuyển đến
hàng đợi nhưng chưa được xử lý,
để xử lý các yêu cầu đó, trình quản lý POA
phải chuyển về trạng thái hoạt động. Trình
quản lý POA thực chất là một đối
tượng kiểm soát trạng thái của POA (trạng
thái chờ, xư lý hay từ chối), nó gắn với POA
ngay khi mới tạo lập. Trong
giao diện tĩnh, đối tượng máy khách sử
dụng các thủ tục Stub để gọi các hàm trong
đối tượng phục vụ. Đối với
giao diện động DII, đối tượng máy khách
gọi các hàm của đối tượng phục vụ
bằng cách sử dụng các thông tin lưu giữ trong kho
giao diện. Giao diện Skeleton động cho phép các
mã lệnh thực hiện trên Servant đăng ký với
môi trường ORB các hàm thực hiện bằng cách mô tả
các tham số của các thao tác. việc sử dụng giao
diện này không nhất thiết đòi hỏi giao diện
gọi đối tượng động DII tương
ứng trên phía máy khách.
Môi trường ORB tạo điều
kiện thuận lợi cho việc trao đổi thông tin
giữa các đối tượng và để các
đối tượng xác định nhau. Tuy nhiên các tính
năng đó chưa đủ để xây dựng các
ứng dụng phân tán qui mô lớn, đặc biệt
đối với các ứng dụng thích hợp cho chuyên
ngành hẹp, vì vậy hãng OMG đã đưa ra một
số tính năng mới thể hiện dưới
dạng các dịch vụ và các phương tiện như
minh họa trên hình 10.8. Nhóm OMG chỉ nêu đặc tả
các dịch vụ giao diện mà các dịch vụ cung
cấp mà không thể hiện cách cài đặt các dịch
vụ như thế nào, các dịch vụ đó độc
lập với môi trường ORB và do đó số
lượng dịch vụ phụ thuộc vào sản
phẩm CORBA của từng hãng.
Dịch vụ đặt tên (Naming Service)
là một trong các dịch vụ cơ bản nhất trong
các dịch vụ của kiến trúc CORBA nói riêng và trong cac
ứng dụng mạng nói chung, nó cho phép các ứng dụng
máy khách xác định được đối
tượng phục vụ bằng cách cung cấp tên sau
đó sẽ nhận được tham chiếu
đến đối tượng. Dịch vụ này cho phép các đối tượng
Servant được đăng ký và xác định
bằng tên, nó sử dụng ngữ cảnh đặt tên
để bảo đảm tập các tên là duy
nhất. Sự kết hợp
giữa tên với đối tượng gọi là ràng
buộc tên và luôn
được định nghĩa liên quan với ngữ
cảnh của tên.
Dịch vụ đặt tên cho phép
kết hợp một hoặc nhiều tên logic với
một tham chiếu đối tượng, lưu giữ
các tên trong không gian tên dưới dạng phân cấp và cho phép đăng ký
tên đối tượng trong thời gian chạy. Các
ứng dụng máy khách có thể tìm ra đối
tượng cần sử dụng bằng cách xác
định tham chiếu đối tượng trong không
gian tên, qui trình của dịch vụ này được
thể hiện trên hình 10.9. Hàm bind(name,objRef) dùng để
tạo ràng buộc tên, hàm resolve(name) xác định
đối tượng ràng buộc với tên trong ngữ
cảnh đã cho. Dịch vụ đặt tên
được mô tả trong mô đun CosNaming và
được viết dưới dạng ngôn ngữ
IDL như sau:
module CosNaming
{
typedef string Istring;
struct NameComponent {
Istring id;
Istring kind;
};
typedef sequence <NameComponent>
Name;
enum BindingType {nobject,
ncontext};
struct Binding {
Name binding_name;
BindingType binding_type;
};
typedef sequence <Binding>
BindingList;
interface BindingIterator;
interface NamingContext {
enum NotFoundReason {
missing_node, not_context, not_object};
exception NotFound {
NotFoundReason why;
Name rest_of_name;
};
exception CannotProceed {
NamingContext cxt;
Name rest_of_name;
};
exception InvalidName{};
exception AlreadyBound
{};
exception NotEmpty{};
void bind(in Name n, in
Object obj)
raises(NotFound,
CannotProceed, InvalidName, AlreadyBound);
void rebind(in Name n, in
Object obj)
raises(NotFound,
CannotProceed, InvalidName);
void bind_context(in Name
n, in NamingContext nc)
raises(NotFound,
CannotProceed, InvalidName, AlreadyBound);
void rebind_context(in
Name n, in NamingContext nc)
raises(NotFound,
CannotProceed, InvalidName);
Object resolve (in Name
n)
raises(NotFound,
CannotProceed, InvalidName);
void unbind(in Name n)
raises(NotFound,
CannotProceed, InvalidName);
NamingContext
new_context();
NamingContext
bind_new_context(in Name n)
raises(NotFound,
AlreadyBound, CannotProceed, InvalidName);
void destroy( )
raises(NotEmpty);
void list (in unsigned
long how_many,out BindingList bl, out BindingIterator bi);
};
interface BindingIterator
{
boolean next_one(out
Binding b);
boolean next_n(in
unsigned long how_many, out BindingList bl);
void destroy();
};
};
Mô dun CosNaming bao
gồm hai thành phần giao diện chính:
-
Giao diện
NamingContext: Cung cấp các thao tác phục vụ cho việc
nhúng các đối tượng và giải quyết các
vần đề về ngữ cảnh của tên.
-
Giao diện
BindingIterator: Cung cấp các thao tác lặp lại việc
nhúng các đối tượng.
Các ứng dụng dựa trên kiến
trúc CORBA phải có cơ chế đồng bộ giữa
các đối tượng khi thực hiện, dịch
vụ dịch vụ sự kiện (Event Service) cung cấp
các công cụ để các đối tượng CORBA có
thể gửi/nhận các sự kiện, dịch vụ này
phải đảm bảo các yêu cầu sau:
-
Đảm
bảo việc phân phát sự kiện chính xác, đối
tượng CORBA chỉ đưa sự kiện vào và
sẽ đảm bảo sự kiện đó đến
đích theo yêu cầu.
-
Các sự
kiện được phân phát theo kiểu hàng đợi.
-
Cho phép các tin
báo nặc danh, bên gửi/nhận không cần biết tên
định danh của bên kia.
-
Cho phép kênh
sự kiện, bên nhận được phép đăng ký
chỉ nhận một số
loại sự kiện.
Dịch vụ sự kiện thực
hiện việc liên lạc giữa các đối
tượng, để đảm nhiệm vai trò này nó
định nghĩa hai vai trò cho đối tượng: vai
trò cung cấp sự kiện và vai trò sử dụng sự
kiện, trao đổi dữ liệu của sự
kiện giữa bên phát sinh và bên xử lý được
thực hiện bằng cách đưa ra các yêu cầu theo
tiêu chuẩn CORBA. Để phục vụ việc trao
đổi thông tin giữa bên phát sinh và bên xử lý sự
kiện, kiến trúc CORBA đề xuất hai mô hình sau:
-
Mô hình
đẩy: Cho phép bên phát sinh sự kiện chủ
động kích hoạt việc truyền dữ liệu
của sự kiện đến bên sử dụng, như
vậy phía phát sinh sự kiện đóng vai trò chủ
động.
-
Mô hình kéo: Cho phép bên xử lý sự kiện
được phép yêu cầu dữ liệu từ bên phát
sinh sự kiện, bên xử lý sự kiện đóng vai trò
chủ động.
Hai mô hình trên cùng thực hiện
nhiệm vụ trao đổi thông tin giữa bên phát sinh và
bên xử lý sự kiện, trong mô hình thứ nhất bên
phát sinh sự kiện chủ động kích hoạt
việc chuyển dữ liệu cho bên xử lý, trong mô hình
thứ hai bên xử lý sự kiện chủ động chuyển
dữ liệu. Để thực hiện các yêu cầu
của dịch vụ này, nhóm OMG đưa ra đặc
tả gồm bốn mô đun: CosEventComm, CosEventChannelAdmin,
CosTypedEventComm, CosTypedEventChannelAdmin. Ví dụ, mô đun
CosEventComm đảm nhiệm chức năng liên lạc
giữa bên phát sinh và bên xử lý sự kiện, nó cung
cấp bốn giao diện và được thể
hiện trên ngôn ngữ IDL như sau:
module
CosEventComm {
exception Disconnected{};
interface PushConsumer {
void push (in any data)
raises(Disconnected);
void
disconnect_push_consumer();
};
interface PushSupplier {
void
disconnect_push_supplier();
};
interface PullSupplier {
any pull ()
raises(Disconnected);
any try_pull (out boolean
has_event)
raises(Disconnected);
void
disconnect_pull_supplier();
};
interface PullConsumer {
void
disconnect_pull_consumer();
};
};
Giao diện PushConsumer dùng để nhận dữ
liệu của sự kiện, như vậy bên cung cấp
sự kiện sử dụng hàm push(...) để
truyền dữ liệu cho bên nhận sự kiện. Giao
diện PushSupplier cung cấp hàm disconnect_push_supplier()
để giải phóng các tài nguyên mà bên cung cấp sự
kiện đã dùng trong quá trình truyền sự kiện. Giao
diện PullSupplier dùng để phát đi dữ liệu
của sự kiện, bên sử dụng sự kiện
gọi hàm pull() hoặc
try_pull(...) để yêu cầu nhận dữ liệu
của sự kiện. Giao diện PullConsumer cung cấp hàm
disconnect_pull_consumer để kết thúc việc trao
đổi thông tin và giải phóng các tài nguyên mà bên sử
dụng sự kiện đã dùng để hỗ trợ
cho việc truyền sự kiện. Giữa đối
tượng phát sinh sự kiện và đối
tượng xử lý sự kiện thường
được cài đặt lớp trung gian gọi là Event
Channel (kênh sự kiện), đây là dịch vụ đóng
cả hai vai trò: phát sinh và xử lý sự kiện. Thực
chất việc cài đặt
kênh sự kiện nhằm mục đích hỗ
trợ cho việc trao đổi thông tin theo mô hình nhiều
đối tượng phát sinh sự kiện với
nhiều xử lý sự kiện đồng thời
tăng hiệu suất hoạt động của hệ
thống.
|
|
 |
Hình 10.10
Nguyên tắc dịch vụ duy trì bền bỉ
Dịch
vụ bền bỉ cung cấp giao diện chung để
bảo đảm việc duy trì và quản lý trạng thái
liên tục của các đối tượng. Khi quá
thời hạn tồn tại, thường các đối
tượng sẽ được lưu trong cơ sở
dữ liệu và khi cần thiết có thể phục
hồi lại. Trạng thái của một đối
tượng gồm hai phần: trạng thái động và
trạng thái bền vững.
Trạng thứ nhất là
thể hiện khi đối tượng
được lưu trong bộ nhớ, điều đó
không đảm bảo tính an toàn của dữ liệu khi
xảy ra sự cố vì vậy đối tượng
sử dụng trạng thái bền để có thể
dễ dàng khôi phục trạng thái động. Hình 3.10 minh
hoạ cơ chế hoạt động của dịch
vụ trạng thái bền vững với nguyên tắc các
đối tượng được lưu trong từng
bộ lưu trữ gốc trong kho dữ liệu, mỗi
tiến trình tạo ra các thể hiện của đối
tượng và ánh xạ tương ứng với các
đối tượng trong kho dữ liệu. Để
truy nhập vào đối tượng trong kho dữ
liệu cần thiết phải tạo liên kết giữa
tiến trình với kho dữ liệu và nhúng đối
tượng logic với đối tượng lưu trong
kho dữ liệu, như vậy việc cập nhật các
biến đối tượng sẽ kéo theo việc
cập nhật đối tượng tương ứng
trong kho dữ liệu.
Dịch
vụ chu kỳ sống qui định các qui tắc
để tạo/xoá/sao chép/di chuyển các đối
tượng CORBA. Các môi trường dựa trên kiến
trúc CORBA hỗ trợ các đối tượng phân tán, do
đó dịch vụ này xây dựng các qui ước
để ứng dụng máy khách
có thể thực hiện các thao tác trên đối
tượng phân tán tại các vị trí khác nhau. Trong
thực tế các thao tác này thường gặp những
vấn đề sau:
-
Vấn
đề khi tạo một đối tượng mới:
Ứng dụng máy khách cần phải kiểm soát
được vị trí để tạo đối
tượng mới và vị trí đó phải
được quyết định theo chính sách quản
trị. Khi tạo một đối tượng mới
ứng dụng máy khách phải tìm ra thực thể tạo
lập đối tượng và liên kết với
thực thể đó để tạo đối
tượng mới, mức độ ảnh hưởng
của máy khách đối với các giá trị ban
đầu của đối tượng mới tạo
lập
-
Vấn
đề di chuyển hoặc sao chép đối
tượng: Ứng dụng máy khách có thể kiểm soát
được vị trí của đối tượng
nguồn và đích tuân thủ theo chính sách quản trị.
Trong qua trình này ứng dụng máy khách phải liên kết
với thực thể phục vụ cho việc sao chép
hoặc di chuyển đối tượng đồng
thời xác định những ảnh hưởng
đối với mã lệnh thực hiện của các
đối tượng được sao chép hoặc di
chuyển.
-
Ảnh
hưởng đến các đối tượng khác: Các
đối tượng phân tán thường có mối liên
kết với nhau và gọi là quan hệ giữa các
đối tượng, việc sao chép/di chuyển hoặc
xoá các đối tượng có thể sẽ ảnh
hưởng tới các đối tượng khác, vì
vậy cần phải xác định ranh giới quan
hệ của đối tượng khi thực hiện
các thao tác trên.
Để
giải quyết các vấn đề trên, dịch vụ
chu kỳ sống xây dựng mô hình xử lý của máy khách
về chu kỳ tồn tại cho đối tượng
phục vụ cho các thao tác tương ứng khi tạo lập, xoá, sao chép và di
chuyển các đối tượng. Đặc tả
của dịch vụ này viết trên ngôn ngữ IDL như
sau:
#include <CosNaming.idl>
#pragma prefix “omg.org”
module
CosLifeCycle{
typedef
CosNaming::Name Key;
typedef
Object Factory;
typedef
sequence <Factory> Factories;
typedef
struct NVP {
CosNaming::Istring
name;
any
value;
}
NameValuePair;
typedef
sequence <NameValuePair> Criteria;
exception
NoFactory {
Key
search_key;
};
exception
NotCopyable { string reason; };
exception
NotMovable { string reason; };
exception
NotRemovable { string reason; };
exception
InvalidCriteria{Criteria invalid_criteria; };
exception
CannotMeetCriteria {Criteria unmet_criteria; };
interface
FactoryFinder {
Factories
find_factories(in Key factory_key)
raises(NoFactory);
};
interface
LifeCycleObject {
LifeCycleObject
copy(in FactoryFinder there,
in
Criteria the_criteria)
raises(NoFactory,
NotCopyable, InvalidCriteria,
CannotMeetCriteria);
void
move(in FactoryFinder there,
in
Criteria the_criteria)
raises(NoFactory,
NotMovable, InvalidCriteria,
void
remove()
raises(NotRemovable);
};
interface
GenericFactory {
#ifdef
NO_ESCAPED_IDENTIFIERS
boolean
_supports(in Key k);
#else
boolean
_supports(in Key k);
#endif
Object
create_object (
in Key
k,
in
Criteria the_criteria)
raises
(NoFactory, InvalidCriteria,
CannotMeetCriteria);
};
};
Một
đối tượng Factory có nhiệm vụ tạo ra
các đối tượng mới, ứng dụng máy khách
liên tạo đối tượng mới bằng cách tham
chiếu đến đối tượng Factory và gửi
yêu cầu tạo lập đối tượng. Giao
diện LifeCycleObject cung cấp các thao tác liên quan tới
sự tồn tại các đối tượng. Để
thực hiện các thao tác này, trước hết máy khách
phải nhận tham chiếu đến đối
tượng LifeCycleObject sau đó gọi các thao tác
tương ứng. Dịch
vụ điều khiển tương tranh cung cấp giao
diện để quản lý tương tranh trong các
đối tượng CORBA nhằm mục đích
đảm bảo cho tất cả các ứng dụng máy khách
có thể đồng thời truy nhập các tài nguyên chung
nhưng vẫn đảm bảo tính nhất quán của
tài nguyên chung đó. Dịch vụ này điều khiển
sử dụng tài nguyên chung bằng khoá đọc/ghi,
mỗi khoá được gán với một tài nguyên và
một ứng dụng máy khách và ứng dụng máy khách
phải nhận được khoá trước khi truy
nhập vào tài nguyên chung. Dịch vụ điều
khiển tương tranh được định
nghĩa trong mô đun CosConcurencyControl như sau:
#include <CosTransactions.idl>
module CosConcurrencyControl {
enum lock_mode {read, write, upgrade, intention_read,
intention_write};
exception LockNotHeld{};
interface LockCoordinator
{
void drop_locks();
};
interface LockSet
{
void lock(in lock_mode mode);
boolean try_lock(in lock_mode mode);
void unlock(in lock_mode mode)
raises(LockNotHeld);
void change_mode(in lock_mode held_mode,
in lock_mode new_mode)
raises(LockNotHeld);
LockCoordinator get_coordinator(
in CosTransactions::Coordinator which);
};
interface TransactionalLockSet
{
void lock(in CosTransactions::Coordinator current,
in lock_mode mode);
boolean try_lock(in CosTransactions::Coordinator
current,
in lock_mode mode);
void unlock(in CosTransactions::Coordinator current,
in lock_mode mode)
raises(LockNotHeld);
void change_mode(in CosTransactions::Coordinator
current,
in lock_mode held_mode,
in lock_mode new_mode)
raises(LockNotHeld);
LockCoordinator get_coordinator(
in CosTransactions::Coordinator which);
};
interface LockSetFactory
{
LockSet create();
LockSet create_related(in LockSet which);
TransactionalLockSet create_transactional();
TransactionalLockSet create_transactional_related(in
TransactionalLockSet which);
};
};
Dịch vụ thể hiện
đối tượng định nghĩa các giao thức
và các qui ước để xuất/tiếp nhận các
đối tượng, các đối tượng có
thể được thể hiện dưới dạng
các dòng bit trong bộ nhớ, trên đĩa hoặc luân
chuyển trên mạng. Dạng thể hiện của
đối tượng có thể tồn tại trong
khoảng thời gian không hạn chế và được
chuyển bằng bất kỳ phương tiện nào
không thuộc môi trường ORB. Trong thực tế, máy khách
thường yêu cầu dữ liệu được
lưu trong tập tin sử
dụng dạng đã được chuẩn hoá, vì
vậy có thể ứng dụng dịch vụ này
để thực hiện chức năng trên. Các
đối tượng phân tán thường được
sử dụng để mô hình hoá thế giới thực,
do đó chúng thường không tồn tại tách biệt mà
ngược lại giữa các đối tượng phân
tán đó luôn tồn tại các quan hệ. Dịch vụ
quan hệ của các đối tượng (Relationship
Service) cho phép thể hiện quan hệ giữa các
đối tượng nhằm mục đích giảm tính
phức tạp trong việc quản lý các mối quan
hệ.
Dịch vụ quản lý giao tác cung
cấp các giao diện hỗ trợ khả năng trao
đổi thông tin giữa các đối tượng CORBA,
việc quản lý các giao dịch đóng vai trò quan trọng
nhằm đảm bảo tính an toàn của hệ
thống, điều này càng trở nên quan trọng hơn
trong môi trường tương tranh. Dịch vụ truy
vấn cho phép ứng dụng thực hiện các thao thác truy
vấn trên các đối tượng CORBA, tương
tự như truy vấn các bảng trong CSDL, tuy nhiên khái
niệm truy vấn trong được mở rộng theo
nghĩa có thể chọn/thêm/cập nhật/xoá tập các
đối tượng. Dịch vụ cấp phép cho phép
định nghĩa các chính sách để điều
khiển việc sử dụng các dịch vụ, có ba
loại chính sách sau:
-
Cấp phép
theo thời gian: ngày bắt đầu, ngày hết hạn,
khoảng thời gian hết hạn sử dụng dịch
vụ.
-
Cấp phép
dựa trên số liệu thưc tế, ví dụ số
liệu thực về việc sử dụng tài nguyên,
số người đồng thời sử dụng
dịch vụ
-
Cấp phép
riêng cho từng người sử dụng
Dịch vụ quyền
sở hữu cho phép các đối tượng xác
định tập các tài sản thuộc quyền sở
hữu theo từng cặp tên/giá trị, khái niệm tài
sản được hiểu là các giá trị đã xác
định gắn với các đối tượng theo
phương pháp động. Dịch vụ thời gian cho phép người sử dụng
có thể tạo ra các sự kiện dựa trên việc
đặt thời gian. Hiện nay mỗi hệ thống
sử dụng cách thể hiện thời gian khác nhau,
kiến trúc CORBA lựa chọn cách thể hiện thời
gian quốc tế UTC. Dịch vụ bảo mật qui
định giao diện cho các thuộc tính bảo mật:
-
Định
danh và uỷ quyền: Kiểm tra người sử
dụng
-
Uỷ
quyền và kiểm soát truy nhập: Xác định
người sử dụng nào được phép truy
nhập tới các đối tượng dịch vụ
nào
-
Lưu
vết: Ghi lại các thao tác của người sử
dụng
-
Bảo
mật truyền tin: bao gồm việc uỷ quyền
người sử dụng đến các dịch vụ,
bảo vệ độ tính hợp và độ tin cậy.
-
Không thừa
nhận: cung cấp các tính năng bảo mật
tương tự như chữ ký điện tử
-
Quản lý các
chính sách bảo mật
Giống như dịch vụ
đặt tên, dịch vụ giới thiệu đối
tượng cho phép một đối tượng khác có
thể xác định các
đối tượng CORBA. Thay vì sử dụng tên,
đối tượng máy khách tìm các dịch vụ dựa
trên tên của thao tác, các tham số và các kiểu giá trị
trả về. Như vậy sự khác nhau cơ bản
giữa dịch vụ này và dịch vụ đặt tên là
ở chỗ dịch vụ đặt tên tìm kiếm
dịch vụ của đối tượng khi biết
chính xác tên của đối tượng trong khi đó dịch vụ giới thiệu đối
tượng xác định dịch vụ dựa trên
vị trí/chức năng/tên của dịch vụ. Dịch
vụ tập hợp hỗ trợ việc nhóm các
đối tượng hoặc hỗ trợ các thao tác
thực hiện trên nhóm các đối tượng. Tập
hợp, ngăn xếp, hàng đợi.... đều là
những tập hợp, nhiệm vụ của dịch
vụ tập hợp là cung cấp một phương pháp
thống nhất để tạo lập và thao tác với
tập các đối tượng chung nhất.
Kiến
trúc CORBA sử dụng ngôn ngữ định nghĩa giao
diện IDL để mô tả giao diện của các
đối tượng. IDL là ngôn ngữ mô tả phục
vụ cho mô hình lập trình hướng đối
tượng, do đó hoàn toàn có khả năng sử
dụng các tính chất kế thừa và đa hình trong ngôn
ngữ lập trình hướng đối tượng.
Mục tiêu của ngôn ngữ IDL là mô tả giao diện
của các đối tượng, do đó độc
lập với ngôn ngữ lập trình và có thể sử
dụng các chương trình dịch để biên dịch
sang các ngôn ngữ lập trình theo yêu cầu. Ngôn ngữ IDL
định nghĩa các loại đối tượng
bằng cách xác định các giao diện của chúng,
mỗi giao diện bao gồm các hàm và các tham số của
hàm. Mã lện thực hiện của các hàm nằm ngoài
phạm vi định nghĩa của ngôn ngữ này, như
vậy nó chỉ thể hiện các thao tác phục vụ
cho máy khách.
Để
truy nhập các đối tượng từ xa, ứng
dụng máy khách cần có địa chỉ của
đối tượng phục vụ, thông tin này chứa
trong bảng tham chiếu đối tượng. Vấn
đề tham chiếu đối tượng đã
được chuẩn hoá trong đặc tả CORBA 2.0
nhằm mục đích cho phép các ứng dụng phân tán có
thể chạy trên môi trường ORB của các hãng khác
nhau.
Khi đã
xác định được giao diện và địa
chỉ của đối tượng phục vụ, có
thể gọi các thao tác từ xa, quá trình này tuân thủ các
bước thực hiện của phần mềm trung
gian. Bắt đầu từ việc biên dịch tập
tin mô tả giao diện viết trên ngôn ngữ IDL sẽ
nhận được Máy trạm stub và Máy chủ skeleton. Yêu cầu của ứng dụng máy
khách được chuyển đến đối
tượng phục vụ thông qua môi trường ORB, quá
trình này hoàn toàn trong suốt đối với người
phát triển.
Để xây
dựng phần mềm của hệ thống phân tán theo
kiến trúc CORBA cần phải xác định các
đối tượng Máy chủ và các đối
tượng Máy trạm
của hệ thống.
Trước
hết cần phải định nghĩa các giao diện máy
chủ, nghĩa là các dịch vụ máy chủ cung cấp
và hương pháp truy nhập các dịch vụ đó
dưới dạng tập tin .idl, sau đó sử dụng trình
IDL để biên dịch tập tin .idl bằng ra ngôn
ngữ lập trình phù hợp, kết quả sẽ
nhận được Stub cho máy khách và Skeleton cho máy
chủ. Bước tiếp theo là viết mã nguồn
thể hiện các giao diện máy chủ cung cấp dựa
trên Skeleton và cuối cùng viết chương trình chính cho máy
chủ với cấu trúc cơ bản của hàm main()
như sau:
-
Khởi tạo ORB và BOA/POA.
-
Tạo các đối tượng máy
chủ.
-
Thông báo cho BOA/POA biết đối
tượng máy chủ đã sẵn sàng
-
Chờ sự kiện CORBA, thực
hiện và kết thúc
Sử dụng Stub đã được tạo trong
bước trên để
tạo tập tin cài đặt các tính năng của máy
khách sau đó viết chương trình chính cho máy khách
với khung hàm main() như sau:
-
Khởi tạo ORB và BOA/POA.
-
Tạo các đối tượng máy khách
-
Thông báo cho BOA /POA biết đối
tượng máy khách đã sẵn sàng
-
Thực hiện các tác vụ như xác định các
đối tượng máy chủ...
Gọi
phương thức từ xa (Java RMI) thực chất là
việc áp dụng phương pháp gọi thủ tục
từ xa trong ngôn ngữ lập trình Java. Java RMI cho phép
một đối tượng chạy trên một máy ảo
Java này có thể kích hoạt một phương thức
của một đối tượng đang chạy trên
một máy ảo Java khác. Đối tượng có
phương thức được gọi từ xa
gọi là các đối tượng ở xa, một
ứng dụng RMI bao gồm chương trình máy chủ và
một chương trình máy khách. Chương trình máy
chủ tạo một số các đối tượng
ở xa, tạo các tham chiếu đến chúng và
chờ những chương trình máy khách kích hoạt các
phương thức của các đối tượng từ
xa này. Chương trình máy khách lấy một tham chiếu đến
một hoặc nhiều đối tượng từ xa
trên máy chủ và kích hoạt các phương thức từ
xa thông qua các tham chiếu. Một chương trình máy khách
có thể kích hoạt các phương thức ở xa trên
một hay nhiều máy chủ, nghĩa là việc thực
thi của chương trình được trải rộng
trên nhiều máy tính. Đây chính là đặc điểm
của các ứng dụng phân tán, RMI là cơ chế
để xây dựng các ứng dụng phân tán bằng ngôn
ngữ Java.
Mô hình khách/chủ dựa trên RMI bao
gồm máy chủ là chương trình cung cấp các đối
tượng có thể được gọi từ xa và máy
khách là chương trình tham chiếu đến các
phương thức của các đối tượng
ở xa trên máy chủ. Stub chứa các tham chiếu
đến các phương thức ở xa trên máy chủ,
trong khi đó Skeleton đón nhận các tham chiếu từ
Stub để kích hoạt phương thức tương
ứng trên máy chủ. Thành phần tham chiếu từ
xa là đóng vai trò truyền
thông của RMI.
Cơ chế định vị đối
tượng từ xa:
Cơ chế này xác định cách thức mà chương
trình Máy khách có thể lấy được tham chiếu đến các đối tượng từ xa. Thông
thường người ta sử dụng dịch vụ đặt
tên lưu giữ các tham chiếu đến các đối
tượng cho phép gọi từ xa mà máy khách sau đó có
thể tìm kiếm.
Cơ chế giao tiếp với các
đối tượng từ xa: Chi tiết của cơ chế giao tiếp với
các đối tượng ở xa được cài
đặt bởi hệ thống RMI.
Tải các lớp dạng bytecodes cho các
lớp mà nó được chuyển tải qua lại
giữa máy ảo: Vì RMI cho
phép các chương trình gọi phương thức từ
xa trao đổi các đối tượng
với các phương thức ở xa dưới
dạng các tham số hay giá trị trả về của
phương thức nên RMI cần có cơ chế cần
thiết để tải mã Bytecodes của các đối
tượng từ máy ảo này sang máy ảo khác. Tiến
trình vận hành của một ứng dụng khách/chủ
theo kiểu RMI gồm các bước sau:
-
Máy chủ
tạo ra các đối tượng cho phép gọi từ xa
cùng với các Stub và Skeleton của chúng.
-
Máy chủ
sử dụng lớp đặt tên để đăng
ký tên cho một đối tượng từ xa.
-
Lớp
đặt tên đăng ký Stub của đối
tượng từ xa với Registry Máy chủ.
-
Thành phần
đăng ký (Registry) máy chủ sẵn sàng cung cấp tham
thảo đến đối tượng từ xa khi có
yêu cầu.
-
Máy khách yêu
cầu định vị đối tượng xa qua tên
đã được đăng ký với dịch vụ
tên.
-
Bộ
phận quản lý tên tải Stub của đối
tượng xa từ dịch vụ tên mà đối
tượng xa đã đăng ký về Máy khách.
-
Cài
đặt đối tượng Stub và trả về tham
khảo đối tượng xa cho Máy khách.
-
Máy khách
thực thi một lời gọi phương thức xa
thông qua đối tượng Stub.
Java hỗ trợ các lớp cần
thiết để cài đặt các ứng dụng khách/chủ
dựa trên RMI trong các gói: java.rmi, trong số đó các
lớp thường được dùng sau:
java.rmi.Naming
java.rmi.RMISecurityManager
java.rmi.RemoteException;
java.rmi.máy
chủ.RemoteObject
java.rmi.máy
chủ.RemoteMáy chủ
java.rmi.
máy chủ.UnicastRemoteObject
Xây dụng một ứng dụng phân tán
bằng cơ chế RMI gồm các bước sau:
-
Thiết
kế và cài đặt các thành phần của ứng
dụng.
-
Biên dịch
các chương trình nguồn và tạo ra Stub và Skeleton.
-
Tạo các
lớp có thể truy xuất từ mạng.
-
Thực thi ứng dụng
Định nghĩa các giao diện từ
xa: Một giao diện
ở xa mô tả các phương thức mà nó có thể
được kích hoạt từ xa bởi các máy khách.
Đi cùng với việc định nghĩa giao diện
từ xa là việc xác định các lớp cục bộ
làm tham số hay giá trị trả về của các
phương thức được gọi từ xa.
Cài đặt các đối tượng
từ xa: Các đối
tượng ở xa phải cài đặt cho một
hoặc nhiều giao diện từ đã được
định nghĩa. Các lớp của đối
tượng từ xa cài đặt cho các phương
thức được gọi từ xa đã
được khai báo trong giao diện ở xa và có thể
định nghĩa và cài đặt cho cả các
phương thức được sử dụng cục
bộ. Nếu có các lớp làm đối số hay giá
trị trả về cho các phương thức
được gọi từ xa thì ta cũng định
nghĩa và cài đặt chúng.
Cài đặt các chương trình máy khách: Các chương trình máy khách có sử
dụng các đối tượng ở xa có thể
được cài đặt ở bất kỳ thời
điểm nào sau khi các giao diện ở xa đã
được định nghĩa.
Giai đoạn này gồm hai
bước:
-
Dùng
chương trình biên dịch javac để biên dịch các
tập tin nguồn như các giao diện ở xa, các
lớp cài đặt cho các giao diện ở xa, lớp máy
chủ, lớp máy khách và các lớp liên quan khác.
-
Dùng trình
biện dịch rmic để tạo ra stub và skeleton cho các
đối tượng từ xa từ các lớp cài
đặt cho các giao diện ở xa.
Tạo một tập tin chứa tất
cả các tập tin có liên quan như các giao diện ở xa
stub, các lớp hỗ trợ mà chúng cần thiết
phải tải về Máy khách và làm cho tập tin này có
thể truy cập đến thông qua một máy chủ.
Thực thi ứng dụng bao gồm
việc thực thi đăng ký RMI trên máy chủ, thực
thi máy chủ, và thực thi máy khách, các công
việc bao gồm:
-
Tạo giao
diện khai báo các phương thức được
gọi từ xa của đối tượng.
-
Tạo
lớp cài đặt cho giao diện đã được
khai báo.
-
Viết
chương trình máy chủ.
-
Viết
chương trình máy khách.
-
Dịch các
tập tin nguồn theo dạng RMI để tạo ra các
lớp tương ứng và stub cho máy khách, skeleton cho máy
chủ.
-
Khởi
động dịch vụ đăng ký.
-
Thực
hiện chương trình máy chủ.
-
Thực thi
chương trình máy khách.
Dịch vụ web là một mô hình
phát triển dựa trên nền tảng công nghệ web, nó
bao gồm tập các chuẩn cho phép các xây
dựng các ứng dụng phân tán mà không
phụ thuộc nền tảng hệ thống. Dịch
vụ web sử dụng các giao thức mở
và bên trong tự chứa các đặc tả dữ
liệu theo chuẩn XML, đó là ngôn ngữ mô
tả dữ liệu để trao đổi
giữa các hệ thống. Tốc độ trao
đổi thông tin dựa trên dịch vụ web
thường không cao, tuy nhiên việc phát triển các
ứng dụng này tương đối đơn
giản, rút ngắn thời gian phát triển phần mềm.
Dịch vụ web liên lạc với máy khách
thông qua các thông điệp XML được
chuyển qua mạng nhờ các giao thức của
tầng ứng dụng như HTTP, FTP, SMPP…, do đó
các ứng dụng có thể truy nhập dịch
vụ web để trao đổi thông tin một cách
dễ dàng. Các ứng dụng dịch vụ web có
thể được viết bằng nhiều
loại ngôn ngữ lập trình khác nhau như Java,
C#.... và có thể dễ dàng mở rộng hoặc nâng
cấp. Để tạo ra ứng dụng lớn
với nhiều đơn vị tham gia, ứng
dụng này sẽ được chia thành
những thành phần nhỏ hay dịch vụ chia
sẻ đặt tại các máy chủ khác
nhau, chúng được đóng gói và giao
dịch qua mạng sử dụng các giao
thức chuẩn của tầng ứng dụng. Ưu
điểm của các giao thức chuẩn là
có thể được truy cập một
cách dễ dàng qua môi trường Internet,
khắc phục được tính đóng
của các công nghệ phân tán khác.
Nền tảng của dịch vụ web
là XML và HTTP, XML là ngôn ngữ mô tả
dữ liệu dùng để trao đổi thông tin giữa
các hệ thống có nền
tảng và ngôn ngữ lập trình khác nhau,
HTTP là giao thức phổ biến
được sử dụng nhiều nhất trên
mạng Internet. Các thành phần dịch vụ
của dịch vụ web bao gồm:
-
SOAP (Simple
Object Access Protocol) là giao thức dựa trên ngôn
ngữ XML, được dùng để cho
các ứng dụng trao đổi thông tin qua giao
thức HTTP.
-
UDDI (Universal
Description Discovery and Integration) là dịch vụ thư
mục, nơi các ứng dụng có thể
đăng ký hay tìm kiếm dịch vụ.
-
WSDL (Web
Services Description Language) là ngôn ngữ dựa trên
ngôn ngữ XML, dùng để xác định các mô
tả trong dịch vụ web.
Dịch vụ web gồm ba thành phần
chính, đó là thành phần cung cấp dịch vụ,
thành phần sử dụng dịch vụ và môi
trường dịch vụ. Thành phần cung cấp
dịch vụ công bố
sự hiện diện của dịch vụ web cho môi
trường dịch vụ, bên yêu cầu dịch vụ
tìm kiếm và yêu cầu thông tin dịch vụ
tại môi trường này. Khi tìm thấy thông tin yêu
cầu, phía máy khách sẽ nhúng dịch vụ web vào ứng
dụng, quy trình tạo một dịch vụ web
gồm các giai đoạn sau:
-
Bên cung
cấp dịch vụ tạo ra một dịch vụ web,
sử dụng WSDL để mô tả.
-
Bên cung
cấp dịch vụ đăng kí dịch vụ.
-
Ứng
dụng khách xác định và yêu cầu dịch vụ
đã được đăng kí bằng
cách truy vấn UDDI, nếu tìm thấy thì nhúng dịch
vụ vào ứng dụng.
-
Dữ
liệu được trao đổi dưới
dạng XML trên nền giao thức HTTP.
Giao thức truy nhập đối
tượng đơn giản (Simple Object Access Protocol) là
một giao thức truyền thông giữa các
ứng dụng qua môi trường Internet, nó
định dạng thông điệp trao đổi
dựa trên ngôn ngữ XML và giao thức HTTP. XML
định dạng dữ liệu dưới dạng văn
bản, do đó có thể dễ dàng đi qua
tường lửa, giao thức SOAP đơn
giản vì có khả năng mở rộng và
độc lập với ngôn ngữ lập
trình cũng như nền tảng hệ thống. Giao
thức SOAP mô tả rõ định dạng của thông
điệp yêu cầu và trả lời dùng trong
việc gửi và nhận thông tin thông qua giao
thức HTTP nhờ phương thức POST. Về cú pháp, thông
điệp SOAP bao gồm:
-
Envelope:
Phần bắt buộc phải có, định
dạng văn bản XML của thông điệp SOAP.
-
Header: Có
thể bỏ qua, chứa các thông tin điều
khiển.
-
Body: Phần
bắt buộc phải có, chứa thông tin
gọi và trả lời.
-
Fault:
chứa thông tin trạng thái và lỗi.
Giao thức SOAP hỗ trợ hai
kiểu truyền thông khác nhau:
-
Gọi
thủ tục từ xa: cho phép gọi hàm hoặc thủ
tục qua mạng, nhiều dịch vụ web sử
dụng kiểu này vì có thêm nhiều trợ giúp.
-
Văn
bản: được viết như kiểu hướng
thông điệp, nó cung cấp tầng thấp trừu
tượng và yêu cầu
lập trình viên phải mô tả dữ liệu cũng
như phương thức sẽ gọi để
thực hiện yêu cầu.
Các định dạng thông điệp,
tham số và lời gọi đến các hàm giao diện
lập trình ứng dụng trong hai kiểu trên khác nhau, do
đó việc quyết định chọn cái nào tùy
thuộc vào thời gian và đặc điểm của dịch
vụ cần xây dựng.
Ngôn ngữ mô tả dịch vụ
web (Web Services Description Language) là ngôn ngữ mô
tả giao tiếp và thực thi dựa trên thông
điệp định dạng XML, WSDL dùng để
mô tả và xác định dịch vụ web, nó cho
biết dịch vụ web cung cấp chức năng gì và được
đặt tại đâu, cách thức truy nhập
và gọi phương thức cung cấp dịch
vụ. Cấu trúc WSDL gồm 4 thành phần:
-
Type:
Định nghĩa những kiểu dữ
liệu dịch vụ web
sử dụng.
-
Message:
Định nghĩa thành phần dữ liệu
của một phương thức
-
PortType:
là thành phần quan trọng nhất của dịch
vụ web, nó mô tả các phương thức
có thể được thực hiện
và các thông điệp liên quan.
-
Binding:
định nghĩa khuôn dạng thông điệp và chi
tiết giao thức cho mỗi cổng.
Thư mục UDDI (Universal Description,
Discovery and Integration) sử dụng ngôn ngữ XML và
các giao thức HTTP, DNS và truyền thông qua SOAP
để thực hiện vai trò trung gian trong quá
trình trao đổi thông tin của các dịch vụ
web, nó là một thư mục dùng để lưu
thông tin của mọi dịch vụ web. Giao diện
của thư mục này được mô tả
bằng ngôn ngữ WSDL, thư mục UDDI bao gồm ba
thành phần:
-
Trang
trắng: Mô tả thông tin nghiệp vụ và đóng vai
trò xuất bản, nghĩa là chứa thông tin
đăng ký dịch vụ của các nhà cung
cấp, bao gồm các thông tin nghiệp vụ
như tên, mô tả nghiệp
vụ, thông tin liên hệ …
-
Trang vàng: Bao
gồm các thông tin mô tả đối tượng
nghiệp vụ, nó chứa các thông tin cần
thiết để một ứng dụng có
thể tìm thấy một dịch vụ web cụ
thể. Một nghiệp vụ có thể cung cấp
nhiều dịch vụ, do đó mỗi trang trắng có thể
gồm nhiều trang vàng.
-
Trang xanh: Chứa
các thông tin ràng buộc, mô tả cách một
ứng dụng kết nối và tương
tác với dịch vụ web sau khi tìm thấy, thông
tin bao gồm đường dẫn, tên phương
thức, kiểu tham số … của dịch vụ web.
Danh sách các dịch vụ web
được mô tả bằng ngôn ngữ WSDL
sẽ được gửi tới UDDI
để đăng ký, tại đây sẽ ánh
xạ danh sách dịch vụ thành bản ghi UDDI
định dạng XML, bản ghi đăng ký UDDI bao
gồm trang trắng, trang vàng và trang xanh.
Để xây dựng một ứng
dụng phân tán dựa trên dịch vụ Web cần thực
hiện các bước sau:
-
Định
nghĩa và xây dựng các chức năng mà dịch vụ
sẽ cung cấp.
-
Tạo WSDL
cho dịch vụ, chuyển đổi thông tin giữa máy
chủ và WSDL.
-
Xây dựng
SOAP trên máy chủ.
-
Đăng ký
WSDL với UDDI để cho phép các máy khách có thể tìm
thấy và truy nhập.
-
Lập trình
viên cho ứng dụng máy khách nhận tập tin
định dạng WSDL và từ đó dựng SOAP cho máy
khách để có thể kết nối với SOAP trên máy
chủ.
-
Xây dựng ứng dụng phía khách, sau
đó gọi dịch vụ thông qua việc kết nối đến
máy chủ cung cấp dịch vụ web.
Sự phát triển nhanh
chóng của công nghệ làm nảy sinh môi trường giao
tiếp không đồng nhất giữa các thành phần
trong hệ thống phân tán. Một vấn đề
đặt ra đối với các tổ chức công
nghệ thông tin là làm sao xây dựng được một
kiến trúc phần mềm có khả năng tích hợp và sử dụng các
thành phần mới nhằm giảm thiểu chi phí phát
triển và bảo trì hệ thống phần mềm. Chúng
ta đã có các kiến trúc hướng đối
tượng phân tán, tuy nhiên các kiến trúc này đều có
đặc tính ràng buộc chặt chẽ giữa các thành
phần với nhau làm cho các kiến trúc này chưa thật
hiệu quả. Kiến trúc hướng dịch vụ ra
đời gần nhằm mục đích quyết những
vấn đề khó khăn trong giao tiếp giữa các
thành phần của hệ thống phân tán.
Kiến trúc hướng
dịch vụ (SOA: Service Oriented Architectural) là một cách tiếp cận tổ
chức hệ thống thông tin sao cho có thể truy nhập các
tài nguyên thông qua các giao diện và thông điệp. SOA dùng
trong các chuẩn mở để biểu diễn các dịch vụ thông qua các giao
diện đã được chuẩn hóa, từng thành
phần riêng lẻ sẽ trở thành những khối cơ
bản để có thể tái sử dụng trong các
ứng dụng khác, vì vậy kiến trúc này được
sử dụng để tích hợp các ứng dụng. Dịch
vụ là các hàm chức năng thực hiện theo quy trình
nghiệp vụ nào đó, chúng có thể dễ dàng tìm
thầy và liên thông với nhau, tuy nhiên mức độ
gắn kết không cao. Mỗi dịch vụ bao gồm
nhiều thành phần và được đóng gói ở mức cáo, người
sử dụng không cần biết vị trí của chúng.
SOA bao gồm các dịch vụ kết nối mềm
dẻo với nhau, mỗi dịch vụ có giao diện
được định nghĩa rõ ràng và độc
lập với nền tảng của hệ thống và có
thể tái sử dụng. SOA là cấp độ cao hơn
của sự phát triển ứng dụng, chú trọng
đến quy trình nghiệp vụ và dùng giao diện
chuẩn để che giấu sự phức tạp bên
trong.
Thiết kế SOA tách
riêng phần thực hiện dịch vụ với giao
diện gọi dịch vụ, điều này tạo nên
một giao diện nhất quán cho ứng dụng sử
dụng dịch vụ mà không cần quan tâm tới công
nghệ thực hiện dịch vụ. Thay vì xây dựng
các ứng dụng đơn lẻ và đồ sộ, nhà
phát triển sẽ xây dựng các dịch vụ tinh gọn
hơn có thể triển khai và tái tạo sử dụng trong
toàn bộ quy trình nghiệp vụ. Điều này cho phép tái
sử dụng phần mềm tốt hơn, cũng như
tăng sự mềm dẻo vì các nhà phát triển có thể
cải tiến dịch vụ mà không làm ảnh
hưởng đến ứng dụng sử dụng
dịch vụ. SOA không hoàn toàn mới, DCOM và CORBA cũng có
kiến trúc tương tự, tuy nhiên các kiến trúc cũ
ràng buộc các thành phần với nhau quá chặt ví dụ
như các ứng dụng phân tán muốn làm việc với
nhau phải được thoả thuận về chi
tiết tập hàm giao diện lập trình ứng dụng,
một thay đổi mã lệnh trong thành phần DCOM sẽ
yêu cầu những thay đổi tương ứng
đối với mã lệnh truy cập thành phần này. Ưu
điểm lớn nhất của SOA là khả năng
kết nối mềm dẻo và tái sử dụng, các
dịch vụ có thể được sử dụng trên mọi
nền tảng và được viết bằng bất
kỳ ngôn ngữ lập trình nào. SOA dựa trên hai nguyên
tắc thiết kế quan trọng, đó là tính mô đun và đóng gói, tính mô đun
tách vấn đề lớn thành nhiều vấn
đề nhỏ để thuận lợi cho việc
xử lý, đóng gói là tính năng che giấu dữ liệu
và nghiệp vụ bên trong
đối với người sử dụng bên ngoài.
Dịch vụ được thiết kế phù hợp
với SOA cần phải được đóng gói cao
ở mức độ cao và có thể dễ dàng tái sử
dụng, việc cài đặt đảm bảo tính
độc lập và trong suốt về vị trí.
Theo nghĩa thông thường, dịch
vụ là hoạt động công việc của
người này phục vụ người khác, trong kỹ
thuật khái niệm dịch vụ được hiểu
là chức năng tiếp nhận các yêu cầu và trả
về kết quả thông qua giao diện chuẩn đã qui
định. Kiến trúc hướng dịch vụ tập
trung vào qui trình nghiệp vụ trên các hệ thống khác
nhau, mục tiêu cơ bản của dịch vụ là
thể hiện tính năng tương ứng với
hoạt động thương mại thực tế. Kiến
trúc hướng dịch vụ phân rã các chức năng
của hệ thống thành các dịch vụ, mỗi
dịch vụ lại được phân rã thành các dịch
vụ nhỏ hơn… Có thể nói dịch vụ là nhân
tố chủ yếu hình thành nên SOA, nói cách khác kiến trúc
SOA lấy dịch vụ làm trọng tâm để xây
dựng các ứng dụng. Từ các quy trình, chính sách, nguyên
lý hay phương pháp hiện thực trong SOA đều
hướng đến khái niệm dịch vụ. Các công
cụ được lựa chọn bởi SOA
hướng đến việc tạo và triển khai các
dịch vụ, ngay cả cơ sở hạ tầng
thực thi được cung cấp bởi SOA cũng
hướng đến việc thực thi và quản lý các
dịch vụ.

Hình 10.11 Kiến trúc hướng dịch
vụ
Về mặt kỹ thuật, dịch
vụ là những sản phẩm phần mềm
được định nghĩa một cách rõ ràng thông
qua các giao diện. Với góc nhìn của doanh nghiệp,
dịch vụ được gắn với một
chức năng thực tiễn mà nó đảm nhận
trong hệ thống. Mỗi dịch vụ thường kèm
theo những chính sách sử dụng như: quyền truy
xuất, thời gian truy xuất, mức độ bảo
mật, chi phí sử dụng dịch vụ… Dịch vụ
kỹ thuật tái sử dụng định nghĩa các
dịch vụ chỉ phục vụ cho mục đích
nghiệp vụ và được tái sử dụng trong
nhiều dòng dịch vụ khác nhau. Các dịch vụ thuộc
loại này có thể tính đến dịch vụ truy
xuất dữ liệu, đăng nhập, quản lý
người dùng.
Phương châm dịch vụ kinh doanh
là tập hợp các dịch vụ hỗ trợ cho
nghiệp vụ nhằm mục đích phục vụ
trực tiếp hay gián tiếp cho khách hàng thông qua hệ
thống tự động. Các kênh dịch vụ kinh doanh
thường được định nghĩa thành miền dịch vụ như tài chính, bán hàng, quảng cáo,
sản xuất, vận chuyển, kỹ thuật, quản
lý lợi nhuận, chăm sóc khách hàng…. Tất cả các
dịch vụ trong miền dịch vụ nên có sự
kết nối với nhau thông qua một từ điển
dữ liệu chung để có thể dễ dàng vận
hành trong hệ thống. Các dịch vụ trong những
miền dịch vụ khác nhau có thể không đồng nhất
về từ điển dữ liệu, do đó cần có
các chính sách truyền dữ liệu khi có yêu cầu đồng
bộ dữ liệu giữa các miền dịch vụ.
Hợp đồng dịch vụ là giao diện giữa dịch
vụ nghiệp vụ và dịch vụ kỹ thuật
nhằm che giấu những thể hiện chi tiết
của dịch vụ kỹ thuật. Nền tảng
dịch vụ Web gồm các chuẩn và phương
tiện giúp các dịch vụ có thể giao tiếp với
nhau một cách độc lập với công nghệ. Các quy
trình và chính sách hướng dẫn của SOA bao gồm các chỉ dẫn cho
sự phối hợp của các dịch vụ nhằm
đạt mức lợi nhuận cao nhất cho doanh
nghiệp. Các phương pháp và công cụ là các công cụ
SOA sẽ dùng trong quá trình quản lý dự án, mô hình dịch
vụ, mô hình dữ liệu, quản lý và phát triển
hệ thống. Các nguyên lý và chỉ dẫn bao gồm các
nguyên lý giúp cho các nhà kiến trúc và các nhà phát triển trong
quá trình xác định các dịch vụ kỹ thuật và
dịch vụ nghiệp vụ.
Dịch vụ là khái niệm chính trong
kiến trúc hướng dịch vụ, mỗi dịch
vụ được định nghĩa bởi một
hợp đồng dịch vụ phân biệt rõ ràng
giữa chức năng và hiện thực. Các dịch
vụ chỉ nên giao tiếp với các dịch vụ khác
thông qua những giao diện được định
nghĩa một các rõ ràng. Dịch vụ có thể
được truy xuất thông qua những chuẩn dùng
trong môi trường giao tiếp rộng như SOAP,WSDL, XML,
HTTP, UDDI… và không nên có ràng buộc quá chặt chẽ. Mỗi
dịch vụ nên thực hiện những tác vụ
rời rạc và cung cấp giao diện đơn giản
khi truy xuất nhằm khuyến khích việc tái sử
dụng chúng cho các hệ thống về sau. Các dịch
vụ nên cung cấp các siêu dữ liệu định
nghĩa các ràng buộc cũng như chức năng
của chúng. SOA lấy dịch vụ làm trọng tâm, do
đó cần cung cấp các công cụ giúp mô hình hóa, phát
triển, triển khai, liên kết, quản lý và kiểm tra
độ bảo mật của các dịch vụ, đó là
các sản phẩm, công nghệ và tiện ích đã
được phê chuẩn.
Khái niệm gắn kết ám chỉ
đến một số điều kiện ràng buộc giữa các thành phần với nhau, chúng có thể là những
điều kiện chặt hoặc lỏng, thậm chí có
những ràng buộc không hề được biết
trước. Hầu hết mọi kiến trúc phần mềm đều hướng đến tính ràng
buộc lỏng giữa các thành phần và gọi là mô hình
cặp lỏng. Mức độ gắn
kết của mỗi hệ thống ảnh hưởng trực tiếp đến khả năng chỉnh sửa hệ thống, gắn kết càng chặt thì càng ảnh
hưởng đến phía sử dụng dịch vụ mỗi khi có thay đổi nào đó xảy ra. Mức độ
gắn kết tăng dần khi khi bên sử dụng dịch vụ biết nhiều thông tin ngầm định của bên cung cấp dịch vụ. Ngược lại, nếu bên sử dụng dịch vụ biết ít thông tin
chi tiết bên trong dịch vụ
trước khi gọi nó thì quan hệ giữa hai bên càng lỏng. SOA hỗ trợ gắn
kết lỏng thông qua việc sử
dụng hợp đồng và nhúng,
người dùng truy vấn đến nơi lưu trữ và cung cấp thông tin dịch vụ để lấy thông tin, một thành phần trong hệ
thống cung cấp dịch vụ truy vấn sẽ trả về tất cả những dịch vụ thỏa mãn
tiêu chuẩn tìm kiếm, từ
đó người dùng chỉ việc chọn dịch vụ cần thiết và thực thi phương thức trên đó theo mô tả dịch vụ. Bên sử dụng dịch vụ không cần phụ thuộc trực tiếp vào cài đặt của dịch vụ mà chỉ dựa trên hợp đồng mà dịch vụ
đó hỗ trợ. Mô hình
cặp lỏng giúp gỡ bỏ những ràng buộc
điều khiển giữa những thành phần
đầu cuối, mỗi thành phần trong hệ
thống phân tán có thể tự quản lý độc
lập nhằm tăng hiệu suất, khả năng
mở rộng và khả năng đáp ứng cao, những thay
đổi trong cài đặt cũng được che
giấu. Gắn kết lỏng đảm bảo tính
độc lập giữa bên cung cấp và bên sử
dụng nhưng nó đòi hỏi các giao diện phải theo
chuẩn và cần một thành phần trung gian quản lý,
trung chuyển yêu cầu giữa các thành phần đầu
cuối.
10.6.4
Chu
kỳ sống dịch vụ
Dịch vụ là một phần của
phần mềm trong hệ thống phân tán, do đó chu
kỳ sống của dịch vụ cũng gần
tương tự như chu kỳ sống của phần
mềm, dịch vụ có thể ở giai đoạn phát
triển hoặc đã đưa vào hoạt động
sản xuất kinh doanh. Nếu ở giai đoạn phát
triển cần phải chỉ ra được các
tương tác dịch vụ và chỉ ra những dịch
vụ cần thiết phải xây dựng, do đó dịch
vụ ở giai đoạn này được hiểu là
một phần xây dựng qui trình kinh doanh. Phần mềm
đã được đưa vào hoạt động kinh
doanh sẽ phát sinh ra nhiều vấn đề và yêu
cầu mới cần phải chỉnh sửa hoặc nâng
cấp, có một số dịch vụ sẽ
được sửa trực tiếp trong khi hệ
thống vẫn đang vận hành. Tuy nhiên, nhiều
trường hợp phức tạp sẽ đòi hỏi
phải tạm thời ngừng dịch vụ để
tập trung cho việc sửa đổi và nâng cấp.
Kiến trúc hướng dịch vụ chia
các dịch vụ thành dịch vụ cơ bản, dịch
vụ tích hợp và dịch vụ qui trình, ba loại này liên
quan mật thiết đến quá trình cung cấp dịch
vụ. Dịch vụ cơ bản cung cấp các tính
năng kinh doanh cơ bản nhất, chúng chưa
được phân cho các dịch vụ khác, thời gian
chạy tương đối ngắn và thuộc loại
không trạng thái, do đó các dịch vụ này rất phù
hợp với phương thức gọi đồng
bộ. Thực tế, các dịch vụ cơ bản
thường được cài đặt để truy
nhập dữ liệu và một số nghiệp vụ
cơ bản như tạo
một người dùng mới hoặc thay đổi
mật khẩu… Các dịch vụ tích hợp
được cấu thành từ một số dịch
vụ cơ bản, nhìn chung thời gian thực hiện
của các dịch vụ này cũng tương đối
ngắn và thuộc loại không trạng thái, sự tích
hợp ở đây có thể thuộc về một
hoặc nhiều nền tảng. Dịch vụ qui trình khác
với hai loại trên, nó phản ánh một qui trình kinh
doanh, do đó thời gian thực hiện khá dài và thuộc
loại có trạng thái.
Trục dịch vụ
doanh nghiệp là hạ tầng kiến trúc cho phép sử
dụng các dịch vụ của hệ thống sản
xuất, thường triển khai các ứng dụng, các
nền tảng và các quy trình nghiệp vụ. Các dịch
vụ này được liên kết và trao đổi thông
tin với nhau nhưng không sử dụng một loại
định dạng dữ liệu chung và cũng không có một chuẩn giao
tiếp chung. Nếu cần giao tiếp với các hệ
thống bên ngoài, vấn đề tích hợp sẽ mở
rộng ra khỏi phạm vi của doanh nghiệp, nó bao
chùm lên các hệ thống và quy trình nghiệp vụ của
các doanh nghiệp khác nhau. Những năm gần đây, một
số giải pháp như tích hợp ứng dụng doanh
nghiệp, doanh nghiệp với doanh nghiệp, kiến trúc
hướng dịch vụ và dịch vụ Web đã tập
trung giải quyết những vấn đề liên quan
tới tích hợp hệ thống thông tin của các doanh
nghiệp. Những giải pháp trên tập trung vào một
vài vấn đề về tích hợp, nhưng chúng
thường là sản phẩm của một công ty nào
đó, giá thành đắt và tốn thời gian triển khai.
Trục dịch vụ doanh
nghiệp theo tiêu chuẩn sẽ giải quyết các
vấn đề liên quan đến việc tích hợp mà
không cần phải loại bỏ những giải pháp đang
sử dụng. Mục đích của trục dịch
vụ doanh nghiệp là làm cho việc tích hợp các ứng
dụng và quy trình trở nên thuận tiện hơn
bằng cách cung cấp một quy trình phân tán, điều
hướng thông minh, bảo mật và có thể tự
động chuyển đổi dữ liệu. Trong
trục dịch vụ doanh nghiệp, những dịch
vụ trên là những dịch vụ nền tảng do
đó các ứng dụng không cần phải thi hành riêng
biệt những yêu cầu trên theo một cách thức riêng
biệt của chúng. Trục dịch vụ doanh nghiệp giải
quyết những điểm yếu của những
giải pháp có sẵn bằng cách tạo ra một nền
tảng chuẩn cho việc tích hợp. Giải pháp điểm–điểm
yêu cầu cứ n thành phần tham gia hệ thống thì
phải có n-1 giao diện để có thể giao tiếp được
với các thành phần còn lại được thay
thế bằng giải pháp trục, mỗi thành phần
chỉ cần một giao diện để giao tiếp
với trục và như vậy sẽ giao tiếp với
các thành phần còn lại. Trục dịch vụ doanh
nghiệp đảm bảo giao tiếp phân tán, chuyển
hướng, xử lý nghiệp vụ, ổn định
và bảo mật, đồng thời cũng cung cấp các
dịch vụ có khả năng cắm và chạy.
Các mô hình dựa trên SOA
thoạt nhìn khá phức tạp, nó tùy thuộc vào góc nhìn
đối với hệ
thống, có thể đó là góc độ kinh doanh hay kỹ
thuật. Mô hình logic phân chia hệ thống thành các miền,
mỗi miền đảm nhiệm vai trò và trách nhiệm
riêng. Khái niệm miền ở đây phản ánh một
thực thể nào đó, ví dụ đó là công ty, phòng/ban… Đứng
trên góc độ kỹ thuật có thể thấy trục
dịch vụ doanh nghiệp đóng vai trò trung tâm, các vùng
chỉ cung cấp các dịch vụ cơ bản và
dịch vụ tích hợp, các dịch vụ qui trình
được tách biệt riêng rẽ.
So với kiến trúc dựa trên thành
phần, điểm khác biệt chính của SOA là cung
cấp khả năng giao tiếp giữa các dịch
vụ sử dụng thông điệp dựa trên các giao
thức phổ biến như HTTP, FTP, SMTP, .... và vì vậy kiến
trúc SOA mới có khả năng độc lập với nền
tảng. Các dịch vụ hoạt động trên nền tảng
khác nhau vẫn có thể giao tiếp với nhau nhờ vào
các giao diện đã được chuẩn hóa để
cộng tác xử lý một tác vụ nào đó. Phương
thức trao đổi thông điệp đã
được tất cả các nền tảng và ngôn
ngữ lập trình hỗ trợ, do đó các dịch
vụ trên các nền tảng nào sẽ hoạt động
với cấu trúc dữ liệu đặc thù của
nền tảng đó. Trao đổi thông điệp có
thể thực hiện theo cơ chế không đồng
bộ, bên gửi và và bên nhận không cần phải
chờ nhau, điều này giúp cho mỗi bên tiếp tục
xử lý công việc sau khi gởi thông điệp mà không
cần dừng thực thi để chờ thông
điệp trả lời.
CHƯƠNG 11:
THỰC HÀNH
Mục đích: Nắm được cách
thực hiện truyền thông nhất thời sử
dụng các hàm nguyên thủy.
Nhiệm vụ 1:
Chạy thử trên máy cục bộ
Vào cửa sổ command,
gõ lệnh ipconfig /all để lấy địa chỉ Ip
sau đó vào tập tin app.config sửa giá trị trên dòng
<add key="ServerIp" value="192.168.3.103"/>
Biên dịch sau đó vào
thư mục \bin, chạy tập ứng dụng SocketServer
Biên dịch sau đó vào
thư mục \bin, chạy tập ứng dụng SocketClient
Nhiệm vụ 2:
Chạy thử trên 2 máy khác nhau
Nhiệm vụ 3 (mở
rộng): Viết ứng dụng chat giữa 2 máy tính.
Mục đích: Nắm được cách
viết dịch vụ web trên máy chủ và cách máy khách
gọi
Nhiệm vụ 1: Sử dụng tiện ích
wsdl để tạo tập tin Client stub của dịch
vụ web theo đường dẫn
http://103.3.252.222/DsWebServices/SampleWebServices.asmx
Bước 1: Tạo ứng dụng Client

Tạo thư mục Code trong Project
Tìm thư mục chứa tập tin wsdl.exe
trong máy tính
(Thông thường trong thư mục C:\Program
Files\Microsoft Visual Studio 8\SDK\v2.0\Bin)
Vào cửa sổ command và thư mục
chứa tập tin wsdl.exe và gõ lệnh sau:
wsdl http://103.3.252.222/DsWebServices/SampleWebServices.asmx

Tiện ích wsdl đã sinh tập tin SampleWebServices.cs,
sao chép tập tin này vào thư mục code của ứng
dụng máy khách.
Viết ứng dụng trên máy khách gọi các
hàm của dịch vụ web.
Nhiệm vụ 1: Chạy thử phần
mềm mẫu.
Nhiệm vụ 2: Tìm hiểu chương
trình mẫu
Nhiệm vụ 3: Viết dịch vụ web
và cài đặt trên máy cục bộ của học viên,
viết ứng dụng máy khách.
Nhiệm vụ 4: Viết ứng dụng
như sau:
Dịch vụ web 1 DestServices Hàm GetServerTime()
trả về thời gian hiện hành
Dịch vụ web 2 MiddleServices Hàm GetServerTime
(string UrlTo DestServices) gọi hàm GetServerTime() của dịch
vụ web 1.
Ứng dụng Client: Gọi hàm GetServerTime (UrlTo DestServices) của
dịch vụ web 2.
Mục đích: Nắm được
giải thuật Cristian, biết chuyển đổi
dữ liệu dạng kết thúc cao sang dạng kết
thúc thấp.
Nhiệm vụ 1: Tìm hiểu chương
trình mẫu và chạy thử.
Nhiệm vụ 2: Viết chương trình
minh họa cho các giải thuật đồng bộ
thời gian vật lý: Berkeley, giải thuật quảng bá,
giải thuật trung bình
|
[1]
|
A.
S. Tanenbaum, M. V. Steen, "Distributed Systems: Principles and
Paradigms", 2nd
Edition, Prentice-Hall, 2007.
|
|
[2]
|
G.
Coulouris, J. Dollimore, T. Kinberg, G. Blair, "Distributed
systems: Concept and Design",
5th Edition,
Addison-Wesley, 2012.
|
|
[3]
|
N.M.
Josuttis, “SOA in Practice – The Art
of Distributed System Design”,
O’Reilly, 2007
|
|
[4]
|
http://www.differencebetween.net/technology/difference-between-grid-computing-and-cloud-computing/
|
|
[5]
|
https://www.linux.com/training-tutorials/building-beowulf-cluster-just-13-steps
|
|
[6]
|
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/socket-code-examples
|